Zugriff auf Gleichartige Komponenten per Index
-
- Beiträge: 97
- Registriert: Sa 20. Jun 2009, 16:00
- OS, Lazarus, FPC: Win10 20H2, Laz 2.0.8 auch Linux Mint Mate 20, Laz 2.0.6
- CPU-Target: 64Bit
Zugriff auf Gleichartige Komponenten per Index
Ich habe auf einem Formular 4 Memos: Memo1,Memo2,Memo3,Memo4 und eine Variable M_aktiv,
die mir sagt, mit welchem Memo gerade etwas gemacht werden soll.
Wie kann ich über einen Index auf das gewünschte Memo zugreifen?
also z.B.: Memo[M_aktiv].Lines.Add(Testzeile'');
Danke für eure Ideen.
die mir sagt, mit welchem Memo gerade etwas gemacht werden soll.
Wie kann ich über einen Index auf das gewünschte Memo zugreifen?
also z.B.: Memo[M_aktiv].Lines.Add(Testzeile'');
Danke für eure Ideen.
Re: Zugriff auf Gleichartige Komponenten per Index
Kann man z.B. so machen:
Code: Alles auswählen
var AMemo:TMemo;
M_aktiv:integer;
begin
M_aktiv:=1;
AMemo:=TMemo(FindComponent('Memo'+inttostr(M_aktiv)));
if Assigned(AMemo) then AMemo.Text:='Hurra';
end;
Re: Zugriff auf Gleichartige Komponenten per Index
Die Variable sollte vom Typ TMemo sein. Dann geht M_aktiv.Lines.Add('Testzeile');lzuser hat geschrieben:Ich habe auf einem Formular 4 Memos: Memo1,Memo2,Memo3,Memo4 und eine Variable M_aktiv,
Code: Alles auswählen
type
TLiveSelection = (lsMoney, lsChilds, lsTime);
TLive = Array[0..1] of TLiveSelection;
Re: Zugriff auf Gleichartige Komponenten per Index
Genau. Und wenn du jedem Memo noch diesen OnEnter und OnExit Handler spendierst, dann wird M_aktiv automatisch auf das entsprechende Memo gesetzt, das gerade den Eingabefokus hat, bzw. auf nil, falls ein anderes Control den Fokus hat:Michl hat geschrieben:Die Variable sollte vom Typ TMemo sein. Dann geht M_aktiv.Lines.Add('Testzeile');
Code: Alles auswählen
procedure TForm1.Memo1Enter(Sender: TObject);
begin
M_aktiv := Sender as TMemo;
end;
procedure TForm1.Memo1Exit(Sender: TObject);
begin
M_aktiv := nil;
end;
-
- Beiträge: 463
- Registriert: Do 8. Jun 2017, 18:21
- OS, Lazarus, FPC: Windows 10 64bit, Lazarus 3.6, FPC 3.2.2
- CPU-Target: 64Bit
- Wohnort: Wien
Re: Zugriff auf Gleichartige Komponenten per Index
Wobei ich in solchen Fällen immer auch den Namen des Handlers ändere, also z.B. statt Memo1Enter einfach MemoEnter, weil die 4 Memos ja alle den gleichen Händler zugewiesen bekommen. Memo1Enter ist da etwas irreführend.
Aber möglicherweise soll das Memo gar nicht durch Maus-Entry oder Exit aktiviert werden, sondern auf Grund von irgendwas aus dem Programm angesprochen werden.
In dem Fall brauchst du etwas wie Findcomponent. Aber besser als findcomponent: im Programm deklarieren und im Oncreate des Formulars die 4 Memos zuweisen, also
etc. Nachdem eine TMemo Variable in Wirkichkeit nur ein Pointer auf die Datenstruktur ist, wird das Memo selbst bei der Zuweisung nicht kopiert, aber du kannst danach darauf über das entsprechende arrayelement genauso zugreifen wie über den Variablennamen. Memos[1].text und Memo1.text ist dann das gleiche, und du brauchst nicht jedes mal mit findkomponent frickeln. Darüberhinaus kommt ein Compilerfehler, wenn du den Namen der Komponente irgendwann änderst, während dir das findcomponent erst zur Laufzeit abstürzt, wenn der Name nicht mehr stimmt.
Aber möglicherweise soll das Memo gar nicht durch Maus-Entry oder Exit aktiviert werden, sondern auf Grund von irgendwas aus dem Programm angesprochen werden.
In dem Fall brauchst du etwas wie Findcomponent. Aber besser als findcomponent: im Programm
Code: Alles auswählen
var Memos: array[1..4] of TMemo
Code: Alles auswählen
Memos[1]:= Memo1
-
- Beiträge: 97
- Registriert: Sa 20. Jun 2009, 16:00
- OS, Lazarus, FPC: Win10 20H2, Laz 2.0.8 auch Linux Mint Mate 20, Laz 2.0.6
- CPU-Target: 64Bit
Re: Zugriff auf Gleichartige Komponenten per Index
"var Memos: array[1..4] of TMemo" Damit komme ich gut zurecht.
"FindComponent" konnte ich an anderer Stelle verwenden.
Den Rest habe ich mir mal "weggelegt".
Danke für eure Tipps.
"FindComponent" konnte ich an anderer Stelle verwenden.
Den Rest habe ich mir mal "weggelegt".
Danke für eure Tipps.