Zugriff auf Gleichartige Komponenten per Index

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
lzuser
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

Beitrag von lzuser »

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.

Benutzeravatar
theo
Beiträge: 10467
Registriert: Mo 11. Sep 2006, 19:01

Re: Zugriff auf Gleichartige Komponenten per Index

Beitrag von theo »

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;

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: Zugriff auf Gleichartige Komponenten per Index

Beitrag von Michl »

lzuser hat geschrieben:Ich habe auf einem Formular 4 Memos: Memo1,Memo2,Memo3,Memo4 und eine Variable M_aktiv,
Die Variable sollte vom Typ TMemo sein. Dann geht M_aktiv.Lines.Add('Testzeile');

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: Zugriff auf Gleichartige Komponenten per Index

Beitrag von wp_xyz »

Michl hat geschrieben:Die Variable sollte vom Typ TMemo sein. Dann geht M_aktiv.Lines.Add('Testzeile');

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:

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;

braunbär
Beiträge: 369
Registriert: Do 8. Jun 2017, 18:21
OS, Lazarus, FPC: Windows 10 64bit, Lazarus 2.0.10, FPC 3.2.0
CPU-Target: 64Bit
Wohnort: Wien

Re: Zugriff auf Gleichartige Komponenten per Index

Beitrag von braunbär »

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

Code: Alles auswählen

var Memos: array[1..4] of TMemo
deklarieren und im Oncreate des Formulars die 4 Memos zuweisen, also

Code: Alles auswählen

Memos[1]:= Memo1
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.

lzuser
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

Beitrag von lzuser »

"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.

Antworten