24. maj 2004 - 22:51Der er
17 kommentarer og 1 løsning
opdatere tekstboks på form vha. API
Jeg har en form1 som creater en form2 hver gang man trykker på knap1.... se koden nedenfor.
procedure TForm1.Button1Click(Sender: TObject); var child: TForm2; begin inc(i);
child := TForm2.Create(Application); with child do begin child.Edit1.Text := inttostr(i); Show; end; end;
hertil er alting godt...
men nu vil jeg gerne opdatere edit1.text på form2... MEN hvordan gør man det? jeg har prøvet at finde ud af hvordan jeg tilgår vha. API.. og jeg har indtil videre fundet ud af hvordan man finder et vindues handle/Hwnd og sætter det vindue i fokus vha. SetForegroundWindow(myhandle);
Men på form2 er der en tekstboks som hedder edit1.. denne vil jeg gerne kunne skrive i fra f.eks. form1 men sådan at man rammer det korrekte vindue/handle... jeg forestiller mig noget i retningen af:
var myform: Tform; myhandle: Hwnd; begin myform := find_vindue_ud_fra_handle(myhandle); myform.edit1.text := 'hyggehejsa'; end;
øhm nej det kan jeg ikke.. fordi form2 ikke "hedder" form2.. den er skabt som en klon af form2 - men den er ikke form2. Den er createt vha. child := TForm2.Create(Application); og derved er den nye form som en form2 - men den kaldes ikke form2 af windows.
SPørgsmålet er hvordan tilgår jeg form2 når jeg har formens handle/Hwnd?
Men nca har ret men du er nød til at flytte din child var ud i form1, det du har lavet er en fejl da child bliver sluppet af button1click og du får derfor aldrig frigivet form2. Og hvad hvis du trykker to gange? (men jeg går udfra at det er et eksempel du kommer med). Du behøves aldrig søge efter et programs egne forme, dem kreerer programmet jo selv.
procedure TForm1.Button1Click(Sender: TObject); begin form2.show; form2.edit1.text := form1.Edit1.Text; ; end;
procedure TForm1.Button2Click(Sender: TObject); var child: TForm2; begin inc(i);
child := TForm2.Create(Application); with child do begin //child.Label_datofil.Caption := opret_dato; child.Caption := inttostr(i); child.Edit1.Text := inttostr(i); Show; end; end;
procedure TForm1.Button3Click(Sender: TObject); var myhandle: Hwnd; WindowText: array[0..255] of char; // holds the text of the window tempform: Tform; begin //form1.ListBox1.Items. myHandle := FindWindow(nil, PChar(edit2.Text)); //myHandle:=FindWindow(nil,'Form1');// form1 er caption
if myHandle <> 0 then begin // ShowWindow(myhandle, SW_MAXIMIZE); // ShowWindow(myhandle, SW_NORMAL); //SW_HIDE, SW_NORMAL, SW_SHOW SetForegroundWindow(myhandle);
procedure TForm1.Button5Click(Sender: TObject); var myhandle: Hwnd; begin if form1.listbox1.itemindex <> -1 then begin myHandle := FindWindow(nil, PChar(form1.listbox1.Items.strings[form1.listbox1.itemindex])); if myHandle <> 0 then begin ShowWindow(myhandle, SW_SHOWNORMAL); SetForegroundWindow(myhandle); form1.ListBox1.Items.Delete(form1.ListBox1.ItemIndex); end; end; end;
procedure TForm1.ListBox1Click(Sender: TObject); var myhandle: Hwnd; begin if form1.listbox1.itemindex <> -1 then begin myHandle := FindWindow(nil, PChar(form1.listbox1.Items.strings[form1.listbox1.itemindex])); if myHandle <> 0 then begin ShowWindow(myhandle, SW_SHOWNORMAL); SetForegroundWindow(myhandle); form1.ListBox1.Items.Delete(form1.ListBox1.ItemIndex); end; end; end;
type TForm2 = class(TForm) Edit1: TEdit; Button3: TButton; procedure Button3Click(Sender: TObject); procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean); private { Private declarations } public { Public declarations } end;
var Form2: TForm2;
implementation
uses Unit1;
{$R *.dfm}
procedure TForm2.Button3Click(Sender: TObject); var WindowText: array[0..255] of char; // holds the text of the window begin GetWindowText(self.Handle, WindowText, 255); // Get the text from the window Form1.ListBox1.Items.Add(WindowText); //Display it in the listbox ShowWindow(self.Handle, SW_HIDE); end;
procedure TForm2.FormCloseQuery(Sender: TObject; var CanClose: Boolean); var WindowText: array[0..255] of char; // holds the text of the window begin if MessageDlg('Vil du "hide" formen i stedet for at lukke?', mtConfirmation, [mbYes, mbNo], 0) = mrYes then begin CanClose := False;
GetWindowText(self.Handle, WindowText, 255); // Get the text from the window Form1.ListBox1.Items.Add(WindowText); //Display it in the listbox ShowWindow(self.Handle, SW_HIDE); end else DestroyWindow(self.Handle); end;
som i kan se af koden er det "procedure TForm1.Button3Click(Sender: TObject);" hvor jeg prøver at opdatere min nye forms tekstboks til "hejsa".. dette gør jeg ved at finde det vindue med caption=form1.edit2.text.. for derefter at bruge dette som handle som referent.. men det er denne ting som jeg ikke kan gennemskue hvordan jeg skal gøre.
Det kan være jeg/vi ikke lige forstod det med listboxen men du skal stadig flytte din child op efter, og sikkert i et array eller til objected til linjerne.
procedure TForm1.Button2Click(Sender: TObject); var child: TForm2; //den her holder faktisk din "eneste" ref til formen, ok? begin inc(i);
child := TForm2.Create(Application); //her returneres en pointer til formen... with child do begin //child.Label_datofil.Caption := opret_dato; child.Caption := inttostr(i); child.Edit1.Text := inttostr(i); Show; end; end;
variablen fjernes fra delphi ved exit fra din proc, ikke også?
Istedet for så skal du gemme værdien, og da du allerede vil have en linje i en listbox til hver form (ikke også?) så kan du jo lige så godt gemme den i listbox.items.objects
som næsten er beregnet på det, så undgår du det "besværlige array".
Du vil så trykke på but2 (=opret en form):
procedure TForm1.Button2Click(Sender: TObject); var child: TForm2; begin inc(i); child := TForm2.Create(Application); //her returneres en pointer til formen... with child do begin //child.Label_datofil.Caption := opret_dato; child.Caption := inttostr(i); child.Edit1.Text := inttostr(i); Show; end; listbox1.add(child.caption,child); //tror det er sådan her //logisk er det korrekt ihvertilfælde end;
Ellers har jeg lidt svært ved se hvad du vil med programmet, skal man ikke kunne trykke på linjerne i listbox'en sådan at formen der hører til vises, og evt osse kunne slette en linje i listen, så skal formen jo frigives. Og ved luk så skal listen løbes igennem og formene frigives.
... men nu har jeg en listboks med henvisninger.. hvordan rydder jeg op i den når brugen blot lukker den enkelte form ned?
Jeg har lavet følgende procedure:
procedure TForm2.FormCloseQuery(Sender: TObject; var CanClose: Boolean); begin if MessageDlg('Vil du lukke formen ned nu?', mtConfirmation, [mbYes, mbNo], 0) = mrYes then begin CanClose := True; self.Free; end else CanClose := false; end;
Men det fjerner jo ikke henvisningen i listboksen.. eller hvad?
den er ok men måske skulle du sammenligne på Tform2 objected, så kan dine captions være internationale (!!!).
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.