Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Label.text im MainFrame aus frame setzen (https://www.delphipraxis.net/216691-label-text-im-mainframe-aus-frame-setzen.html)

tkhandel 13. Feb 2025 12:25

Label.text im MainFrame aus frame setzen
 
Hallo,
ich habe zwar verschiedenen Beiträge gefunden bezüglich Frames, bin aber nicht schlau daraus
geworden und alle Beispiele haben irgendwie nicht funktioniert.

Eine mainForm ruft ein Frame dynamisch auf das wiederum bei einem Buttoncklick ein anderes Frame dynamich
aufruft das dann in dem MainPanel des aufrufenden Frames angezeigt wird;

procedure TfraTour.btnTourWBClick(Sender: TObject);
var
fraTourLaden_WB1 : TfraTourLadenWB;
begin
fraTourLaden_WB1 := TfraTourLadenWB.Create(self);
fraTourLaden_WB1.Parent := self.pnlMain; // panel des Frame
fraTourLaden_WB1.vAufrufVon := 'Tagestour';
end;



in dem aufgerufenen Frame wird ein datum gewählt und

procedure TfraTourLadenWB.btnWeiterClick(Sender: TObject);
var
fraTour1 : TfraTour;
begin
dm.vWiederbesuch := TMSFNCCalendar1.Date;
dm.vWBString := ( jb_unit.getTag(dm.vWiederbesuch) + DateToStr(TMSFNCCalendar1.Date) );
dm.EinstSaveIni('TagesTour', 'WB', dm.vWBString);

if vAufrufVon = 'Tagestour' then
begin
fraTour1.btnTourWB.Text := dm.vWBString;
end;
...

self.Free;
self := nil;
end;


Fehler Im Projekt TKHKasse.exe ist eine Exception der Klasse $C0000005 mit der Meldung 'access violation at 0x019c42cb: read of address 0xd1e51268' aufgetreten.


Habe auch scon probiert es über procedure in der Mainfrom oder in dem Datenmodul zu lösen, leider ohne Erfolg

Uwe Raabe 13. Feb 2025 12:48

AW: Label.text im MainFrame aus frame setzen
 
Ich habe das mal formatiert:
Delphi-Quellcode:
procedure TfraTourLadenWB.btnWeiterClick(Sender: TObject);
var
  fraTour1 : TfraTour;
begin
  dm.vWiederbesuch := TMSFNCCalendar1.Date;
  dm.vWBString := ( jb_unit.getTag(dm.vWiederbesuch) + DateToStr(TMSFNCCalendar1.Date) );
  dm.EinstSaveIni('TagesTour', 'WB', dm.vWBString);

  if vAufrufVon = 'Tagestour' then
  begin
    fraTour1.btnTourWB.Text := dm.vWBString;
  end;
  ...

  self.Free;
  self := nil;
end;
Zum einen ist die lokale Variable
Delphi-Quellcode:
fraTour1
an der Stelle offenbar nicht initialisiert und zum anderen sollte man eher selten
Delphi-Quellcode:
Self.Free
aufrufen und vermutlich niemals
Delphi-Quellcode:
Self := nil
setzen.

Mir ist auch noch nicht ganz klar, was du überhaupt erreichen willst.

himitsu 13. Feb 2025 13:05

AW: Label.text im MainFrame aus frame setzen
 
vielleicht
Delphi-Quellcode:
Self.Release;

und ja, wenn durch irgendwas, nach deiner Methode, im übergeordneten Code auf die Form zugegriffen wird, dann knallt es natürlich, wenn die Form schon weg ist.

Uwe Raabe 13. Feb 2025 13:10

AW: Label.text im MainFrame aus frame setzen
 
Zitat:

Zitat von himitsu (Beitrag 1546153)
vielleicht
Delphi-Quellcode:
Self.Release;

und ja, wenn durch irgendwas, nach deiner Methode, im übergeordneten Code auf die Form zugegriffen wird, dann knallt es natürlich, wenn die Form schon weg ist.

Anhand des Namens
Delphi-Quellcode:
TfraTourLadenWB
und der Bemerkung im Original
Zitat:

Zitat von tkhandel (Beitrag 1546150)
in dem aufgerufenen Frame wird ein datum gewählt und

gehe ich davon aus, dass es sich um einen Frame handelt. Da ist das Release eher nicht der richtige Ansatz.

jaenicke 13. Feb 2025 13:31

AW: Label.text im MainFrame aus frame setzen
 
Wenn auf einem Formular ein Frame liegt, der durch einen anderen ausgetauscht werden soll, sollte das auch im Formular passieren. Und wenn ein Frame auf einem Elternframe liegt, sollte sich der Elternframe darum kümmern.

Das bedeutet:
Wenn auf dem Frame eine Aktion ausgelöst wird, die dazu führt, dass der aktuelle Frame entfernt werden soll, sollte das per Event an das Formular oder den Elternframe mitgeteilt werden, damit dort die Aktion ausgeführt wird.

tkhandel 14. Feb 2025 08:23

AW: Label.text im MainFrame aus frame setzen
 
Hallo,

ja danke erstmal für die schnellen Antworten!! Aber ich bin damit leider auch nicht weitergekommen.
Kann es sein das es am laden der Frames zur Laufzeit (also dynamisch) oder gar an FMX liegt?

Ich versuche es mal ohne Code zu erklären, ist vielleicht einfacher:

Formular ruft Frame1 auf und Frame1.Parent ist die Form,

Aus Frame1 rufe ich Frame2 für eine Abfrage auf, Frame2 hat als Parent Frame1
Frame2 wieder schließen und das Ergebnis (ein String) auf einem Label in Frame 1 anzeigen.
(hört sich so einfach an, aber ich kriege es nicht hin)

Ich habe es mit einer Procedure im Formular versucht, mit einer Procedure in Frame1 oder über
eine Variable in Frame1 usw. knallt immer.

Das Problem ist ja das FMX nicht wartet sondern weiterarbeitet sonst könnte ich das Ergebnis einfach nach der Rückkehr
aus Frame2 aus einer variable lesen.

bräuchte also mal wieder eure Hilfe.

PS: Was ist falsch daran die Frames nach gebrauch mit Free und nil zu entsorgen?

jaenicke 14. Feb 2025 08:39

AW: Label.text im MainFrame aus frame setzen
 
Zitat:

Zitat von tkhandel (Beitrag 1546180)
Ich habe es mit einer Procedure im Formular versucht, mit einer Procedure in Frame1 oder über
eine Variable in Frame1 usw. knallt immer.

Grundregel:
Pack die uses grundsätzlich unter Interface (nicht unter implementation).* Dann merkst du sofort, wenn du nicht nur in einer Richtung zugreifst.
Das Formular sollte nur Frame1 kennen und Frame1 nur Frame2 (und nicht das Formular), aber Frame2 sollte niemals Frame1 oder das Formular kennen.

Mit diesen Grundregeln sollte es leichter fallen, das sauber umzusetzen. Hat Frame2 denn schon das passende Event, das den String als Ergebnis übergeben bekommt?

Zitat:

Zitat von tkhandel (Beitrag 1546180)
PS: Was ist falsch daran die Frames nach gebrauch mit Free und nil zu entsorgen?

Daran ist erst einmal nichts falsch, aber das sollte nicht das Element selbst in einer Methode des Elements machen. Das wäre als ob du nicht zuerst aus dem Abbruchhaus (Frame2) rausgehst und dem Bagger (Frame1) Bescheid sagst, dass er anfangen kann, sondern im Haus den Boden unter deinen Füßen selbst zertrümmerst. Denn wenn die Methode beendet ist, wird ja das Objekt, das diese aufgerufen hat, weiterarbeiten wollen. Da wäre es doof, wenn das schon freigegeben ist...

Und die Freigabe kannst du dann auch nicht direkt in dem Event von Frame2 machen, sondern z.B. mit TThread.ForceQueue aus diesem Kontext gelöst.

* Ja, ich weiß, dass es auch Sinn machen kann, das anders zu machen. Aber zur Vermeidung von Kreuzreferenzen ist das nun einmal der effektivste Weg.

tkhandel 14. Feb 2025 09:26

AW: Label.text im MainFrame aus frame setzen
 
Hallo

das mit der Einbindung hatte ich schon gemerkt, lässt sich aber tatsächlich nicht immer vermeiden.

Wenn Frame1 Frame2 aufruft, aber Frame2 Frame1 nicht kennen darf wie kann dann Frame2 etwas an Frame1 übergeben?
Da müsste ich ja wieder eine andere Unit einbinden die eine function oder procedure ausführt die
Frame1.Label1.Text aktualisiert aber diese Unit müsste ja wieder sowohl Frame1 kennen als auch Frame 2
was macht das denn für einen Sinn? das ist doch zirkulär oder ?

Uwe Raabe 14. Feb 2025 09:45

AW: Label.text im MainFrame aus frame setzen
 
Zitat:

Zitat von tkhandel (Beitrag 1546186)
Wenn Frame1 Frame2 aufruft, aber Frame2 Frame1 nicht kennen darf wie kann dann Frame2 etwas an Frame1 übergeben?
Da müsste ich ja wieder eine andere Unit einbinden die eine function oder procedure ausführt die
Frame1.Label1.Text aktualisiert aber diese Unit müsste ja wieder sowohl Frame1 kennen als auch Frame 2
was macht das denn für einen Sinn? das ist doch zirkulär oder ?

Es gibt einen ganzen Koffer voll von Werkzeugen mit denen man solche Abhängigkeiten oder gar zirkuläre Referenzen auflösen kann. (Wäre vielleicht mal eine nette Session für die Foren-Tage...)

In diesem Fall scheint ein Event (z.B. OnTextChange) in Frame2 die simpelste Lösung. Frame1 setzt eine eigene Methode (MyTextChange) als Eventhandler in Frame2 und der ruft bei einer anzuzeigenden Änderung diesen auf. In MyTextChange wird dann Label1.Text zugewiesen.

tkhandel 14. Feb 2025 10:24

AW: Label.text im MainFrame aus frame setzen
 
Hallo Uwe,

das hört sich nachvollziehbar an. Hast du evtl. ein Beispiel für so einen Eventhandler damit ich sehe wie so was
grundsätzlich richtig implemntiert wird.

DANKE


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:39 Uhr.
Seite 1 von 2  1 2      

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