[Gelöst]Manual Docking

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
charlytango
Beiträge: 843
Registriert: Sa 12. Sep 2015, 12:10
OS, Lazarus, FPC: Laz stable (2.2.6, 3.x)
CPU-Target: Win 32/64, Linux64
Wohnort: Wien

[Gelöst]Manual Docking

Beitrag von charlytango »

Hi,

ich werde noch verrückt -- etwas das seit Jahren ohne Probleme klappt geht plötzlich nicht mehr. Code aus funktionierender Applikation kopiert.

Möchte ein Form in ein auf dem Hauptformular liegendes TPanel eindocken.
Hat immer geklappt --nun macht es in Laz 2.0.11 und in 2.0.13 Zoff.

Solange das Form welches eingedockt werden soll leer ist, klappt es. Wenn Controls (und da nur Panels und Labels) drauf sind wird das Mainformular nicht mehr angezeigt (aus dem Debugger) und irgendwas läuft scheinbar in einer Schleife.

Code: Alles auswählen

procedure TfrmMain.FormCreate(Sender: TObject);
var
  ownd:TfrmTest;
begin
  ownd := TfrmTest.Create(self);
  with ownd do
  begin
    DisableAlign;
    Align := alClient;
    ManualDock(Panel1, NIL, alClient);
    EnableAlign;
    Show;
  end;
end;


Beim Debuggen genau an der Stelle ManualDock(...) verabschiedet sich das program ins Nirwana. Von außerhalb, also direkt im Explorer gestartet das gleiche Bild -- irgendwas frisst Ressourcen und nur der Taskmanager kann den Prozess killen.

Hab ein funktionierendes Rumpfprojekt und ein kaputtes beigelegt

Please Help :oops:
Dateianhänge
project1_crash.zip
und hier geht etwas schief
(125.87 KiB) 60-mal heruntergeladen
project1_ok.zip
hier klappt noch alles
(125.79 KiB) 56-mal heruntergeladen
Zuletzt geändert von charlytango am Mi 21. Apr 2021, 21:11, insgesamt 1-mal geändert.

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

Re: Manual Docking

Beitrag von Michl »

Habe es eben probiert:

Code: Alles auswählen

procedure TfrmMain.FormCreate(Sender: TObject);
var
  ownd:TfrmTest;
begin
  ownd := TfrmTest.Create(self);
  // geht nicht
{  with ownd do
  begin
    DisableAlign;
    Align := alClient;
    ManualDock(Panel1, NIL, alClient);
    EnableAlign;
    Show;
  end;
}
  // geht
  ownd.DisableAlign;
  ownd.Align := alClient;
  ownd.ManualDock(Panel1, NIL, alClient);
  ownd.EnableAlign;
  ownd.Show;
end;
Also "with", wenn immer es geht, meiden! Ich selber nutze es überhaupt nicht :wink:

Code: Alles auswählen

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

charlytango
Beiträge: 843
Registriert: Sa 12. Sep 2015, 12:10
OS, Lazarus, FPC: Laz stable (2.2.6, 3.x)
CPU-Target: Win 32/64, Linux64
Wohnort: Wien

Re: Manual Docking

Beitrag von charlytango »

Michl hat geschrieben:
Mi 21. Apr 2021, 20:38
Also "with", wenn immer es geht, meiden! Ich selber nutze es überhaupt nicht :wink:
Da will man nur mal etwas "moderner" sein und schon geht es schief -- Danke dir vielmals !

Case Closed

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

Re: [Gelöst]Manual Docking

Beitrag von wp_xyz »

Ich fände es wichtiger zu verstehen, warum dein erster Ansatz fehlgeschlagen hat.

Du hast da zwei Formulare, TfrmMain und TfrmTest. Beide enthalten ein Panel1. Du willst offenbar eine Instanz von TfrmTest erzeugen und ans Panel1 des frmMain andocken. Das Problem ist in der Tat die "with" Anweisung:

Code: Alles auswählen

  with ownd do
  begin
    DisableAlign;
    Align := alClient;
    ManualDock(Panel1, NIL, alClient);
    EnableAlign;
    Show;
  end; 
Denn der Parameter Panel1 in ManualDock steht im "with" Block, gehört also zu ownd, der neuen Instanz von TfrmTest - dein Code will also ein Formular ownd erzeugen und es an ein Panel in sich selbst andocken - stelle ich mir topologisch recht "interessant" vor...

Stattdessen willst du ownd an das Panel des aufrufenden TfrmMain andocken. Das heißt zwar auch Panel1, aber du kannst die Zweideutigkeit aufheben, indem du es mit "self" als zur aufrufenden Klasse (TfrmMain) zugehörig erklärst:

Code: Alles auswählen

procedure TfrmMain.FormCreate(Sender: TObject);
var
  ownd:TfrmTest;
begin
  ownd := TfrmTest.Create(self);
  with ownd do
  begin
    DisableAlign;
    Align := alClient;
    ManualDock(Self.Panel1, NIL, alClient);   // <--- Neu: "Self.Panel1" statt "Panel1"
    EnableAlign;
    Show;
  end;
end;    
So funktioniert es dann auch mit "with" Anweisung.

charlytango
Beiträge: 843
Registriert: Sa 12. Sep 2015, 12:10
OS, Lazarus, FPC: Laz stable (2.2.6, 3.x)
CPU-Target: Win 32/64, Linux64
Wohnort: Wien

Re: [Gelöst]Manual Docking

Beitrag von charlytango »

wp_xyz hat geschrieben:
Mi 21. Apr 2021, 22:37
Ich fände es wichtiger zu verstehen, warum dein erster Ansatz fehlgeschlagen hat.
Ich auch --- Danke für diese detaillierte Erklärung.

Da scheint mir über die Jahre der Zufall (und das routinemäßige Umbenennen der Panels) geholfen zu haben.
Jetzt ist mir klar warum das schief gehen musste -- nochmals Danke -- wieder was gelernt.

Antworten