Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Memo per ButtonClick schliessen (https://www.delphipraxis.net/15023-memo-per-buttonclick-schliessen.html)

Pseudemys Nelsoni 20. Jan 2004 18:10


Memo per ButtonClick schliessen
 
hoi

ich erstelle zur laufzeit 1 button, 1 memo, 1 tabsheet.



Delphi-Quellcode:
Type TFenster = Record
                  TabSheet: TTabSheet;
                  Memo: TMemo;
                  Button: TButton;
                end;

...

var
  dynArray: Array of TFenster;

...

procedure TForm1.ButtonClick(Button: TObject);
var
  nummer: string;
begin
  with Button as TButton do
  begin
    nummer := Name;
    delete(nummer, 1, 6);  // 1-6 = 'Button'
    showmessage('Memo' + nummer);
    (FindComponent('Memo' + nummer) as TMemo).Free;
  end;
end;

...

procedure TForm1.ButtonlClick(Sender: TObject);
begin
  SetLength(dynArray, high(dynArray)+2);
  dynArray[high(dynArray)].TabSheet := TTabSheet.Create(self);
  with dynArray[high(dynArray)].TabSheet do
  begin
    Name := 'TabSheet' + IntToStr(high(dynArray)+1);
    Caption := 'hi';
    PageControl := PageControl1;
    Show;
  end;
  dynArray[high(dynArray)].Memo := TMemo.Create(self);
  with dynArray[high(dynArray)].Memo do
  begin
    Name := 'Memo' + IntToStr(high(dynArray)+1);
    Parent := dynArray[high(dynArray)].TabSheet;
    Left := 10;
    Top := 10;
    Height := dynArray[high(dynArray)].TabSheet.Height-20;
    Width := dynArray[high(dynArray)].TabSheet.Width-20;
    Show;
  end;
  dynArray[high(dynArray)].Button := TButton.Create(self);
  with dynArray[high(dynArray)].Button do
  begin
    Name := 'Button' + IntToStr(high(dynArray)+1);
    Parent := dynArray[high(dynArray)].TabSheet;
    Left := 50;
    Top := 50;
    Height := 21;
    Width := 70;
    Show;
    OnClick := ButtonClick;
  end;
end;


wies geht mein memo per Free nicht weg?

Christian Seehase 20. Jan 2004 19:03

Re: Memo per ButtonClick schliessen
 
Moin Pseudemys Nelsoni,

das dürfte daran liegen, dass Dein FindComponent im ButtonClick fehlschlägt.
Ohne Angabe der zugehörigen Kompo wird das FindComponent des Formulares benutzt, da es in einer Methode des Formulares aufgerufen wird, der Parent für das Memo ist aber das Tabsheet.
Somit ist das Memo nicht im Array of Components des Formulares enthalten, und wird dort nicht gefunden.

Pseudemys Nelsoni 20. Jan 2004 19:46

Re: Memo per ButtonClick schliessen
 
hoi,

krieg ichn tip :oops:

selbst wenn ich überall als Parent Form1 angebe gehts nicht, hmm

Christian Seehase 20. Jan 2004 19:54

Re: Memo per ButtonClick schliessen
 
Moin Pseudemys Nelsoni,

dann leg' doch mal in der ButtonClick Routine noch eine Variable vom Typ TComponent an, und weise dieser das Ergebnis von FindComponent zu, statt es direkt zu benutzen.
Anschliessend kannst Du dann ja prüfen, ob FindComponent erfolgreich war oder nicht (Wert der Variablen <> nil => gesuchte Kompo gefunden)

Pseudemys Nelsoni 20. Jan 2004 20:04

Re: Memo per ButtonClick schliessen
 
Hallo Christian,

Delphi-Quellcode:
procedure TForm1.ButtonClick(Button: TObject);
var
  nummer: string;
  tc: TComponent;
begin
  with (Button as TButton) do
  begin
    nummer := Name;
    tc := TComponent.Create(self);
    delete(nummer, 1, 6);  // 1-6 = 'Button'
    tc := FindComponent('Memo' + nummer);
    tc.Free;
  end;
end;
meinst du so? Das funktioniert auch nicht. :\

Christian Seehase 20. Jan 2004 20:06

Re: Memo per ButtonClick schliessen
 
Moin Pseudemys Nelsoni,

im Prinzip meinte ich das so, nur, dass Du erst einmal nachschauen solltest, ob tc überhaupt einen gültigen Wert enthält.

Pseudemys Nelsoni 20. Jan 2004 20:15

Re: Memo per ButtonClick schliessen
 
tc erhält "Memo1"

deswegen hab ich s.o im Test auch "showmessage('Memo' + nummer);" mit drin gehabt, hatte nur vergessen das hier für das forum rauszunehmen

Pseudemys Nelsoni 21. Jan 2004 05:07

Re: Memo per ButtonClick schliessen
 
hm, selbst wenn ich findcomponent direkt "Memo!" gebe schlisst sich das memo1 nicht:

Delphi-Quellcode:
procedure TForm1.ButtonClick(Button: TObject);
var
  tc: TComponent;
begin
  with (Button as TButton) do
  begin
    tc := TComponent.Create(self);
    tc := FindComponent('Memo1');
    tc.Free;
  end;
end;

Pseudemys Nelsoni 21. Jan 2004 05:09

Re: Memo per ButtonClick schliessen
 
lag komischerweise daran, das ich das Memo1.free innerhalb von dem with button as tbutton ausgeführt habe, komisch, wieso das? also es geht so:

Delphi-Quellcode:
procedure TForm1.ButtonClick(Button: TObject);
var
  tc: TComponent;
begin
  tc := TComponent.Create(self);
  tc := FindComponent('Memo1');
  tc.Free;
end;
bzw so:

Delphi-Quellcode:
procedure TForm1.ButtonClick(Button: TObject);
begin
  TMemo(FindComponent('Memo1')).Free;
end;

Christian Seehase 22. Jan 2004 19:21

Re: Memo per ButtonClick schliessen
 
Moin Pseudemys Nelsoni,

dann schau Dir mal in der Hilfe die Methoden von TButton an.
Danach dürfte klar sein, warum es nicht so funktioniert hat.

BTW:
In meinem ersten Posting hatte ich Dir ja schon vorgeschlagen mit anzugeben, von welcher Kompo Du das FindComponent benutzen willst.
Zugegeben, meine Feststellung mit dem Form1.FindComponent war falsch, weil ich das With nicht beachtet hatte, aber bei direkter Angabe der Kompo vor dem FindComponent hätte es auch innerhalb des With-Blockes funktioniert.


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:54 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz