zugriff von aussen

Rund um die LCL und andere Komponenten
khh
Beiträge: 489
Registriert: Sa 5. Apr 2008, 09:37
OS, Lazarus, FPC: Win Vista,Win 7 (L 0.9.29 FPC 2.4.1)
CPU-Target: 32Bit /64 Bit
Wohnort: Nähe Freiburg i.Br.

zugriff von aussen

Beitrag von khh »

hallo zusammen,
ich hoffe ich nerve euch nicht all zu sehr :)
Bin halt relativ neu in der OOP und komme ursprünglich von COBOL
da war alles noch anders ;-)

Ich habe eine Klasse, zb Tnotebook mit einigen TPages auf denen befinden sich diverse bmps und labels.
kann ich jetzt direkt z.b. die Caption eines labels x auf page y auf Notebook z setzen , indem ich über die Instanz zugreife? wen ja wie?
Oder muss ich die Eigenschaften innerhalb der Klasse setzen indem ich public-variablen verwende.

Danke für eure Hilfe

Gruss KH

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Beitrag von pluto »

Kommt drauf an wie du die Komponenten erstellst. Z.b. wenn du sie Dynamisch Erstellt würde ich FindComponet verwenden. Dafür braucht jede komponente einen eindeutigen namen.

Oder verstehe ich jetzt deine Frage falsch ?

Wenn die Komponenten Statisch auf das From kommen kannst du es direckt über die Variable machen: Label1.Caption:=''Hallo;
MFG
Michael Springwald

danny61
Beiträge: 94
Registriert: So 5. Nov 2006, 18:40
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Wohnort: Berlin

Beitrag von danny61 »

Ich denke du mußt hier noch mal genauer beschreiben was du vor hast.
Prinzipiell kannst du natürlich von überall auf jedes Objekt zugreifen, wenn du weißt wie es heißt.

khh
Beiträge: 489
Registriert: Sa 5. Apr 2008, 09:37
OS, Lazarus, FPC: Win Vista,Win 7 (L 0.9.29 FPC 2.4.1)
CPU-Target: 32Bit /64 Bit
Wohnort: Nähe Freiburg i.Br.

Beitrag von khh »

hallo zusammen,
dann beschreib ich euch das nochmal genauer.
Ich erstelle zur Laufzeit ein TNotebook.
Zur Laufzeit deshalb, weil auf dem gleichen Platz im HaupForm, je nach Einstellungen, diverse Komponenten dargestellt werden sollen.
Ebenfalls zur Laufzeit erstelle ich mehrere TPages auf der Notebook.
Die Anzahl dieser ist unterschiedlich.
dazu lese ich aus einem File ( oder record) die Beschriftungen und erstelle in einer while-Scheife die Tpages.
In dieser Schleife weise ich die Caption der einzelne Pages zu.
Den Name hier zuzuweisen, der sinnigerweise identisch mit der beschrifung sein soll, ist ein weiteres Problem, da die Beschriftungen Umlaute enthalten.
Das alles geschieht in einer separaten Unit.
Jetzt möchte ich auf den diversen Tpages zum einen Labels unterbringen, und aus dem Hauptform heraus beschriften.
Ebenso sollen auf den Tpages diverse Bitmaps untergebracht werden und auf das onCklick-Ereignis ebenfalls vom Hauptform aus reagiert werden.
So, ich hoffe ich hab das jetzt einigermassen verständlich erklärt.

Ich danke euch für eure Mühe

Gruss KH

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Beitrag von pluto »

Ja ! Dann ist FindComponent deine Funktion.
hier ein Beispiel:
TLabel(FindComponet('Label1')).caption:='Test1';
sollte klappen.

Wie schon gesagt du musst hierfür jede Komponenten einen namen zuweisen. Dann würde es so gehen.
MFG
Michael Springwald

khh
Beiträge: 489
Registriert: Sa 5. Apr 2008, 09:37
OS, Lazarus, FPC: Win Vista,Win 7 (L 0.9.29 FPC 2.4.1)
CPU-Target: 32Bit /64 Bit
Wohnort: Nähe Freiburg i.Br.

Beitrag von khh »

hallo Michael,
danke, dann werd ich das so versuchen.
Die Umlaute muss ich wohl selbst behandeln, oder gibts da irgendwo was?

Gruss KH

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Beitrag von pluto »

Du musst statt String widestring verwenden.
MFG
Michael Springwald

khh
Beiträge: 489
Registriert: Sa 5. Apr 2008, 09:37
OS, Lazarus, FPC: Win Vista,Win 7 (L 0.9.29 FPC 2.4.1)
CPU-Target: 32Bit /64 Bit
Wohnort: Nähe Freiburg i.Br.

Beitrag von khh »

danke dir

Gruss KH

khh
Beiträge: 489
Registriert: Sa 5. Apr 2008, 09:37
OS, Lazarus, FPC: Win Vista,Win 7 (L 0.9.29 FPC 2.4.1)
CPU-Target: 32Bit /64 Bit
Wohnort: Nähe Freiburg i.Br.

Beitrag von khh »

hallo zusammen,
irgendwie kom ich mit der Syntax nicht klar

if FindComponent('Seite1') as Tpage nil then
begin
Tpage(FindComponent('Seite1')).Caption := 'hallo Seite1';
end;

oder
TPage(FindComponent('Seite1')).caption:='Test1' ;

funktioniert, wenn ich es aus der Klasse heraus verwende in der ich die Pages erstelle.
Im Hauptform erstelle ich eine Instanz der Klasse so:
MyNotebook := TMyNotebook.create(self);

wenn ich obige Syntax jetzt im Hauptform verwende, krieg ich
Access Violation.

Die Erstellung der TPages soll aber in der separaten (TMyNotebook) Klasse bleiben :-(

Wie kann ich findComponent ausserhalb der Klasse verwenden ?

Gruss KH

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

Beitrag von theo »

khh hat geschrieben: Wie kann ich findComponent ausserhalb der Klasse verwenden ?
MyNotebook.FindComponent('....

khh
Beiträge: 489
Registriert: Sa 5. Apr 2008, 09:37
OS, Lazarus, FPC: Win Vista,Win 7 (L 0.9.29 FPC 2.4.1)
CPU-Target: 32Bit /64 Bit
Wohnort: Nähe Freiburg i.Br.

Beitrag von khh »

hallo zusammen, hallo Theo,

if MyNotebook.FindComponent('test1') as Tpage nil then
begin

Tpage(MyNotebook.FindComponent('test1')).caption:='hallo Test1';

end;

funktioniert soweit, dass das Programm keinen Fehler bringt und auch in die if-abfrage reingeht.

passieren tut aber letztendlich nix :cry:
was stimmt an der Zuweisung des Caption nicht?

Gruss KH

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Beitrag von pluto »

Ich vermute du möchtest die Beschriftung von einem Label ändern, wenn ja das würde so gehen:
Tlabel(MyNotebook.FindComponent('Label1')).caption:='hallo Test1';

Ist das nicht so das du auch noch in den gewünschten Tab suchen müsstest ?
also praktisch so:
Tlabel(MyNotebook.pages[0].FindComponent('Label1')).caption:='hallo Test1';
wenn das Label 1 auf der ersten seite ist.
Wenn das erste nicht geht sollte das hier gehen.

Wobei natürlich sichergestellt werden sollte das es Label1 auch gibt, ob auf groß klein Schreibung geachtet wird kann ich nicht mit Sicherheit sagen, aber ich glaube schon.

Wenn alle stricke reißen könntest du dir noch eine Pointer Liste mit allen Komponenten die du erstellst hast anlegen, und dadrin suchen. Ist zwar blöd sollte aber gehen.

Sonst müsste ich selbst mal testen.

Dein Ziel ist es doch eine Komponente zu erstellen und zwar auf einer Seite im Notebook ?
und diese Komponente sollte beschriftet werden. Also einen Text zugewiesen bekommen. ?
MFG
Michael Springwald

khh
Beiträge: 489
Registriert: Sa 5. Apr 2008, 09:37
OS, Lazarus, FPC: Win Vista,Win 7 (L 0.9.29 FPC 2.4.1)
CPU-Target: 32Bit /64 Bit
Wohnort: Nähe Freiburg i.Br.

Beitrag von khh »

Hallo Michael,
danke, ich werd das mal so ausprobieren.
Dein Ziel ist es doch eine Komponente zu erstellen und zwar auf einer Seite im Notebook ?
und diese Komponente sollte beschriftet werden. Also einen Text zugewiesen bekommen. ?
das ist richtig

Gruss KH

khh
Beiträge: 489
Registriert: Sa 5. Apr 2008, 09:37
OS, Lazarus, FPC: Win Vista,Win 7 (L 0.9.29 FPC 2.4.1)
CPU-Target: 32Bit /64 Bit
Wohnort: Nähe Freiburg i.Br.

Beitrag von khh »

hallo zusammen, hallo Michael,
Tlabel(MyNotebook.FindComponent('Label1')).caption:='hallo Test1';

funktioniert einwandfrei, das passt super :D ,
bei
Tlabel(MyNotebook.pages[0].FindComponent('Label1')).caption:='hallo Test1';
bringt er mir einen
main.pas(145,44) Fatal: Syntax error, ")" expected but "(" found
und setzt den Cursor zwischen den Punkt und FindComponent.

Super wäre es natürlich,wenn es funktionieren würde, dass man auf die page auch uber findcomponent und nicht nur über den Index zugreifen könnte.

Gruss KH

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

Beitrag von theo »

Schau dir doch die Typen an in Code-Insight.
MyNotebook.pages[0] ist vom Typ TStrings, das kann nicht klappen.
MyNotebook.page[0] gibt ein TPage zurück.

Ausserdem solltest du Nil und Typen-Checks machen, sonst gibt's u.U. Ärger beim Zugriff.
z.B. so:

Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
var aPage:TPage;
aComp:TComponent;
begin
  aPage:=Notebook1.Page[0];
  if Assigned(aPage) then
  begin
   AComp:=APage.FindComponent('Label1');
    if Assigned(AComp) and (AComp is TLabel) then TLabel(AComp).Caption:='Test';
  end;
end;

Antworten