Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailemVyřešeno Delphi - button

Zdravím tu všechny.
Z delphi znam jen zaklady co do mně tlačili před par lety ve škole.
Poradte nebo mně někam nasměrujte.

Vytvořím prazdný form1 určite šiřky a 0 vyšky.

Další form 2 bude jako setup - přidej button.

Přes tento setup form bych chtěl, abych si moh přidat do form1 třeba 5 buttonu pod sebou.
V každem buttonu by bylo tohle, jen adresa jina a ukladat třeba do ini.

var
  lHTTP: TIdHTTP;
s: string;
begin
  lHTTP := TIdHTTP.Create(nil);
  try
    s := lHTTP.Get('http://192.168.15.44');
  finally
    lHTTP.Free;
  end;
Předmět Autor Datum
Na Form1 budes mit udalost OnButtonClick. Tu si vytvor napr. vlozenim buttonu a napsanim udalosti. P…
Jan Fiala 01.07.2016 09:49
Jan Fiala
Tak jsem zkusil a asi jsem to nepochopil. Dal jsem na form1 button a do udalosti procedure TForm1.Bu…
Vašek.P 01.07.2016 17:16
Vašek.P
Ja som to celé akosi nepobral, čo vlastne chceš docieliť a načo Ti treba ďalší "setup form"... Čo za…
pme 01.07.2016 17:21
pme
Pak jsi udelal nekde chybu. Koukni se na prilozenou ukazku. Protoze nize vyplynulo, ze to nepotrebuj…
Jan Fiala 01.07.2016 18:11
Jan Fiala
Trochu jsem o tom přemyšlel a na me znalosti moc složite. Až pozdějí budu upravovat. Takže zjednodu…
Vašek.P 01.07.2016 17:48
Vašek.P
Ako fajn a v čom je problém? Proste si načítaš adresy zo súboru a za behu vytvoríš potrebný počet tl…
pme 01.07.2016 18:03
pme
No moc jsem nepochopil. Vytvořit par tlačitek pod sebou zvladnu. Jak však vytvořit za běhu pro každe…
Vašek.P 01.07.2016 18:22
Vašek.P
Áno, JaFi Ti už dal hotový program, Ty už len musíš dorobiť načítanie IP adries zo súboru... Po stla…
pme 01.07.2016 18:30
pme
Ako vidím, nie je to o nepochopení, ale o logickom rozmýšľaní... No on je problem ten, že umim vytv…
Vašek.P 01.07.2016 22:03
Vašek.P
Obsluha je pre každé tlačítko tá istá... pochopiteľne... netreba robiť pre každé tlačíttko zvlášť ob…
pme 02.07.2016 11:23
pme
Chybku jsem tam mněl :-[ procedure TForm1.FormCreate(Sender: TObject); var TS: TStringList; B: TBut…
Vašek.P 01.07.2016 22:38
Vašek.P
premennú m:String {m := Copy(s, Pos(',', s) + 1, MaxInt);} nikde nepoužiješ - čo s stým chceš ďalej…
pme 02.07.2016 11:26
pme
Zrejme jsi se nekoukal na kod, ktery jsem ti nahore daval, vid? Do hintu tlacitka jsem ulozil adresu…
Jan Fiala 02.07.2016 15:48
Jan Fiala
premennú m:String {m := Copy(s, Pos(',', s) + 1, MaxInt);} nikde nepoužiješ - čo s stým chceš ďalej…
Vašek.P 02.07.2016 21:36
Vašek.P
Tak vyřešeno. Nakonec jsem to nacpal do StringGridu. poslední
Vašek.P 03.07.2016 10:44
Vašek.P

Na Form1 budes mit udalost OnButtonClick. Tu si vytvor napr. vlozenim buttonu a napsanim udalosti. Pak button smaz.
V ni budes mit ten svuj kod, jen si IP adresu prectes z Hintu buttonu, ktery ji zavolal.

Procedure PridejButton(AForm: TForm; const ACaption, AHint: string; const X, Y: integer);
begin
  with TButton.Create(AForm) do
  begin
    Parent := AForm;
    Left := X;
    Top := Y;
    Caption := ACaption;
    Hint := AHint;
    OnClick := AForm.OnButtonClick;
  end;
end;

Volat to pak budes treba:
PridejButton(Form1, 'Server 1', '192.168.15.44', 20, 50);
Do INI si zapises to same, co posilas do procedury na vytvoreni buttonu. Form tam zapisovat nemusis, ten znas.

P.S. je to z hlavy, takze pripadne chyby si oprav.

Tak jsem zkusil a asi jsem to nepochopil.
Dal jsem na form1 button a do udalosti procedure TForm1.Button1Click dal ten kod, co je v prvním postu.
Pak button s form1 smazal.
Vložil tu Vaši proceduru.
A do FormCreate dal PridejButton(Form1, 'Server 1', '192.168.15.44', 20, 50);

Spustit to jde bez chyby ale button nikde.

Ja som to celé akosi nepobral, čo vlastne chceš docieliť a načo Ti treba ďalší "setup form"... Čo zamýšľaš Ty, musíš si to aj vedieť premyslieť prečo práve tak, alebo inak.

Či nebude chyba tu: "Vytvořím prazdný form1 určite šiřky a 0 vyšky."

Takto si pridáš niekoľko tlačítok za behu:

var
  B: TButton;
  i: Integer;
begin
  for i := 0 to 9 do
  begin
    B := TButton.Create(Self);
    B.Caption := Format('Button %d', [i]);
    B.Parent := Self;
    B.Height := 23;
    B.Width := 100;
    B.Left := 10;
    B.Top := 10 + i * 25;
  end;
end;

Trochu jsem o tom přemyšlel a na me znalosti moc složite.
Až pozdějí budu upravovat.

Takže zjednodušeně.

Jeden prazdný formulař.
Jeden textovy soubor a v něm

Zapní1
192.168.1.15
Zapní2
192.168.1.20
Zapní3
192.168.1.28

Zapni je caption pro button.
192.168.1.15 je string pro Get

V tomto připadě by se měli na form pod sebou vykreslit 3 buttony a každy by měl mit jiny caption a jinou http adresu.
Do souboru se budou přidavat další udaje, takže tlačitek bude přibyvat.

Ako fajn a v čom je problém?
Proste si načítaš adresy zo súboru a za behu vytvoríš potrebný počet tlačítok (neviem prečo práve tlačítka, dá sa to riešiť aj nejakým stringlistom, zobrazenie v ListView a pod...)

Do procedury kde budeš vytvárať tlačítak napr. môj príklad vyššie si pridaj ešte obsluhu udalosti:

B.OnClick := MyButtonClick;

Samotná obsluha stlačenia tlačítka bude vyzerať takto:

procedure TForm1.MyButtonClick(Sender: TObject);
var
  Button: TButton;
begin
  Button := Sender as TButton; 
  ShowMessage(Button.Caption + ' clicked');
end;

Myslím, že z toho pochopíš aj Ty o čo tam ide... uprav si podľa seba atď... Celý program Ti písať nebudem, snaž sa trošku aj sám...;-)

No moc jsem nepochopil.
Vytvořit par tlačitek pod sebou zvladnu.
Jak však vytvořit za běhu pro každe tlačitko tu udalost onclick a v ní ten kod s 1 postu.
Pan Jan Fiala to myslel dobře a take to trochu chapu.

Vytvořím par tlačitek a každe se bude odkazovat na tu jednu proceduru onclick co tam necham.

Áno, JaFi Ti už dal hotový program, Ty už len musíš dorobiť načítanie IP adries zo súboru...
Po stlačení tlačítka sa zobrazí okno s nejakým textom (čo v tej správe asi je ?)
Ten text použiješ v kóde s 1 postu...

Ako vidím, nie je to o nepochopení, ale o logickom rozmýšľaní...

Ako vidím, nie je to o nepochopení, ale o logickom rozmýšľaní...

No on je problem ten, že umim vytvořit tlačitka, ale vubec nechapu jak na to, aby každe tlačitko mělo svoji proceduru Button1Click a v ní ty přikazy.

už mam textak a v něm

Zapní1,192.168.1.15
Zapní2,192.168.1.20
Zapní3,192.168.1.28

procedure TForm1.Button1Click(Sender: TObject);
var
  lHTTP: TIdHTTP;
  s: string;
begin
  Beep;
  lHTTP := TIdHTTP.Create(nil);
  lHTTP.Request.BasicAuthentication:=True;
  lHTTP.Request.Username := 'admin';
  lHTTP.Request.Password := 'admin';

  try
    s:= lHTTP.Get('http://192.168.1.15');
  finally
    lHTTP.Free;
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
var
 TS: TStringList;
 B: TButton;
 s,m:string;
 i:integer;
begin
  TS := TStringList.Create;
  TS.LoadFromFile('setup.txt');

  for i  := 0 to TS.Count-1 do
  begin
    s:= TS[i];
    B := TButton.Create(Self);
    B.Caption := Copy(s, 1, Pos(',', s)-1);
    m := Copy(s, Pos(',', s) + 1, MaxInt);
    B.Parent := Self;
    B.Height := 23;
    B.Width := 100;
    B.Left := 10;
    B.Top := 10 + i * 25;
    B.OnClick := Form1.Button1Click;
  end;
  TS.Free;
end;

Vykresli mi to ty 3 tlačitka a přepiše Caption
Jelikož je tam
B.OnClick := Form1.Button1Click;
Všechny tlačitka dělají to co je v procedure TForm1.Button1Click
Dal s tým nemohu pohnout.:-[

Obsluha je pre každé tlačítko tá istá... pochopiteľne... netreba robiť pre každé tlačíttko zvlášť obsluhu, stačí jedna.
V obsluhe sa predá parameter Sender:TObject = to znamená, že vieš aké tlačítko bolo stlačené.
A keďže tam bude:

procedure TForm1.MyButtonClick(Sender: TObject);
var
  Button: TButton;
begin
  Button := Sender as TButton;                           <= práve toto je to stlačené tlačítko
  ShowMessage(Button.Caption + ' clicked');              <= zobrazí sa to čo nesie tlačítko ako titulok, vždy bude iný....
end;

No a keďže už vieš, čo presne je v titulku, môžeš s ním ďalej robiť...

čiže si môžeš uložiť titulok (caption) do premennej a túto premennú použiť ako parameter pre lHTTP.Get(tvoja_premenna);

nejak takto:

var
  Button: TButton;
  moja_premenna: String
begin
  Button := Sender as TButton;                          
  moja premenna:= Button.Caption;     

  ...
  try
    s:= lHTTP.Get(moja_premenna;
  ...
           
end;

Naozaj toto sú jednoduché veci, predávanie parametrov sú úplné základy...

Chybku jsem tam mněl :-[

procedure TForm1.FormCreate(Sender: TObject);
var
 TS: TStringList;
 B: TButton;
 s,m:string;
 i:integer;
begin
  TS := TStringList.Create;
  TS.LoadFromFile('setup.txt');

  for i  := 0 to TS.Count-1 do
  begin
    s:= TS[i];
    B := TButton.Create(Self);
    B.Caption := Format(Copy(s, 1, Pos(',', s)-1), [i]);
    m := Copy(s, Pos(',', s) + 1, MaxInt);
    B.Parent := Self;
    B.Height := 23;
    B.Width := 100;
    B.Left := 10;
    B.Top := 10 + i * 25;
    B.OnClick := Form1.Button1Click;
  end;
  TS.Free;
end;

premennú m:String {m := Copy(s, Pos(',', s) + 1, MaxInt);} nikde nepoužiješ - čo s stým chceš ďalej robiť?

V tom m je vždy načtena ta adresa 192.168.1.15, 192.168.1.20, 192.168.1.28

Zapní1,http://192.168.1.15
Zapní2,http://192.168.1.20
Zapní3,http://192.168.1.28

Ja myslel, že když v procedure TForm1.Button1Click změním to s:= lHTTP.Get('192.168.1.15');
na s:= lHTTP.Get(m); tak každy buton bude mit jinou adresu.

Zpět do poradny Odpovědět na původní otázku Nahoru