Unvollständige Anzeige eines Formulars [gelöst]

Rund um die LCL und andere Komponenten
zappa2
Beiträge: 43
Registriert: Do 28. Nov 2013, 09:54

Unvollständige Anzeige eines Formulars [gelöst]

Beitrag von zappa2 »

Auf einem Formular in einer DLL habe ich u.a. ein PageControl mit derzeit 4 TabSheets, auf denen diverse Controls sitzen (nur Lazarus-Standard, nix Exotisches).

Beim modalen Aufruf dieses Formulars habe ich nun den Effekt, das auf 2 der TabSheets beim ersten Anzeigen diverse Controls (derzeit wohl nur Labels) fehlen und auch der Hintergrund des TabSheets in weiß und nicht im default-grau dargestellt ist. Wechsle ich die ActivePage und komme danach wieder auf die zuvor unvollständig gezeichnete Seite zurück, wird sie richtig dargestellt. Nun habe ich schon in alle möglichen Ereignisse ein Invalidate+Refresh+Repaint reingebaut - alles ohne Erfolg.

Auch habe ich im OnShow des Formulares explizit zwischen den TabSheets hin- und hergewechselt; das gewünschte Ergebnis kommt trotzdem erst beim manuellen Seitenwechsel. So ein komisches Verhalten hatte ich noch nie :evil:

Hat jemand einen Tipp zur Lösung dieses Problems?
Zuletzt geändert von zappa2 am Di 27. Aug 2019, 10:29, insgesamt 1-mal geändert.

Warf
Beiträge: 1908
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: Unvollständige Anzeige eines Formulars

Beitrag von Warf »

Auf einem Formular in einer DLL habe

Wie hast du das denn gemacht? Wird die Application klasse die sich um das message dispatchen kümmert in der DLL behandelt, oder erstellst du in der DLL nur die Forms und lädst sie in eine andere Lazarus anwendung?

Denn das letztere darfst du nicht machen denn
1. die LCL exceptions feuern kann, welche dann von der Umgebenden (nicht DLL) LCL umgebung abgefangen werden, was weder unter windows noch unter linux erlaubt ist, und damit nicht definiertes verhalten hat
2. du davon ausgehen musst das exakt die selbe LCL und FPC version verwendet wird, da alles andere wieder nicht definiertes verhalten ist, was natürlich die Idee einer DLL schon wieder witzlos macht
3. Speicher der in der DLL alloziert wird kann mit einem anderen memory manager alloziert werden, wodurch das Free'n außerhalb der DLL undefiniert ist (und vice versa).
Langer rede kurzer sinn, wenn du nicht die gesammte LCL umgebung in der DLL lädst, ist das verhalten komplett undefiniert, und damit ist deine anwendung schlicht und ergreifend kaputt.

Wenn du die gesammte LCL umgebung in der DLL lädst, wäre es natürlich hilfreich zu wissen wie du das machst. Denn was z.B. auch nicht definiert ist, ist wenn du Klassen aus der DLL an die umgebende Anwendung übergibst (du musst also rein prozedual arbeiten).

zappa2
Beiträge: 43
Registriert: Do 28. Nov 2013, 09:54

Re: Unvollständige Anzeige eines Formulars

Beitrag von zappa2 »

Erst mal vielen Dank, dass Du Dich der Sache annimmst!

Also ich rufe in der eigentlichen Hauptunit der DLL nur eine Prozedur aus Unit1 auf, welche das ShowModal des Formulars macht:

Code: Alles auswählen

 
library mylib;
 
{$mode objfpc}{$H+}
{$codepage utf8}
 
uses
  Interfaces, Dialogs, Controls, Forms, Classes, SysUtils, Inifiles, LazUTF8,
  datetimectrls, dm, Unit1;
 
{...}
 
function ShowAdminWindow(FilePath: PChar; UserID: Integer): Integer; cdecl;
begin
  Result := -1;
  if OpenDb(FilePath) then begin  // stellt dem Formular einige kleine Hilfsfunktionen zur Verfügung
    try
      formshowmodal;
    finally
      CloseDb(FilePath);
    end;
    Result := 0;
  end;
end;
 
exports
  {...}
  ShowAdminWindow resident;
 
begin
  Application.Initialize;
end.
 


Und in der Formularunit Unit1:

Code: Alles auswählen

 
procedure FormShowModal;
var f: TForm1;
begin
  f:=TForm1.Create(Application);
  try
    f.ShowModal;
  finally
    f.Free;
  end;
end;
 

Sieht mir alles normal aus. Oder was ist falsch bzw. habe ich etwas vergessen?

Es gibt natürlich keine andere Instanz des Formulars.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6199
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Unvollständige Anzeige eines Formulars

Beitrag von af0815 »

Hier ist in der Free Pascal Wiki der Weg wie es geht. https://wiki.freepascal.org/Form_in_DLL . Das habe ich selbst schon unter Windows ausprobiert und es geht prinzipiell. Die Wege was bei Delphi angeprisen werden, kann man nicht verwenden, da der interen Aufbau zu unterschiedlich ist.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

zappa2
Beiträge: 43
Registriert: Do 28. Nov 2013, 09:54

Re: Unvollständige Anzeige eines Formulars

Beitrag von zappa2 »

Erst mal Danke für Deine Mühen.

Ich habe das Bsp. mit der Callback-Funktionalität nachgebaut. Allerdings bekomme ich dabei folgenden Fehler:

Code: Alles auswählen

Failed to create win32 control, error: 1406:
Untergeordnetes Fenster kann nicht auf der obersten
Ebene erstellt werden.


Also das sieht mir langsam nach einem grundsätzlichen Bug in Lazarus aus.
Ein eingebundenes Datenmodul dagegen funktioniert in der DLL völlig klaglos. Und da werden etliche StoredProcs, Querys und Generatoren angesprochen.

Fenster aus einer DLL heraus konnte sogar schon Delphi5 vor 20 Jahren total easy.

Bin kurz davor, die DLL auf Delphi5 umzustellen, da gibt es diesen Ärger nicht. Ich komme mir langsam vor wie ein Phantomjäger :evil:

zappa2
Beiträge: 43
Registriert: Do 28. Nov 2013, 09:54

Re: Unvollständige Anzeige eines Formulars

Beitrag von zappa2 »

Nachtrag:

Wenn ich meine ursprüngliche Lösung nehme, dann funktioniert ja das Formular, sobald man das PageControl mind. 1 mal manuell umgeschalten hat.

Auch die Funktionalitäten auf dem Formular funktionieren. Ich denke, dass das Problem anders gelöst werden muss. Die Callback-Funktionalität ist es -meiner Meinung nach- jedenfalls nicht.

Benutzeravatar
h-elsner
Lazarusforum e. V.
Beiträge: 259
Registriert: Di 24. Jul 2012, 15:42
OS, Lazarus, FPC: LINUX Mint21.1, Win10, Lazarus 2.2.4, FPC3.2.2
CPU-Target: X86-64; arm 32bit
Wohnort: Illertissen
Kontaktdaten:

Re: Unvollständige Anzeige eines Formulars

Beitrag von h-elsner »

Wenn ich richtig verstehe, was du beschreibst, dann handelt es sich hier wahrscheinlich um ein Windows-"Feature". Das kam irgendwann bei Windows auf (ich glaube bei Win7), dass Controls erst gezeichnet werden, wenn sie "gebraucht", also mit der Maus überfahren werden.
Nach neueren Win10 Updates habe ich das Verhalten nicht mehr beobachtet. Welches Betriebssystem läuft denn bei dir?

Gruß HE

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6199
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Unvollständige Anzeige eines Formulars

Beitrag von af0815 »

Die Dll und die Main Application haben jeweils ein Applikationsobjekt. Damit wird das Applikationsobjekt gewechselt wenn im Main erstellt und in der dll das showmodal aufgerufen wird. Deswegen dürfte es zu deinen Erscheinungen kommen. Bei Lazarus sind einige Sachen anders als in Delphi gelöst, da Delphi nicht Multiplattform ist (war).
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

zappa2
Beiträge: 43
Registriert: Do 28. Nov 2013, 09:54

Re: Unvollständige Anzeige eines Formulars

Beitrag von zappa2 »

Sowohl auf Windows 10 Pro 64bit Build 18362, also dem derzeit aktuellsten, als auch auf Windows Server 2012 R2 Standard 6.3.9600 läßt sich dieses Verhalten reproduzieren.

Daran wird es sicher auch nicht liegen. Ich habe im FormShow sogar die einzelnen Komponenten Refresh/Repaint/Invalidate-et. Langsam habe ich keine Idee mehr.

zappa2
Beiträge: 43
Registriert: Do 28. Nov 2013, 09:54

Re: Unvollständige Anzeige eines Formulars

Beitrag von zappa2 »

Ich habe jetzt mal das Applicationobject des aufrufenden Programms als Parameter fürs Form.Create mit übergeben => keine Änderung des Verhaltens :(

Nach einmal am PageControl hin- und herklicken alles okay - also wie gehabt.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6199
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Unvollständige Anzeige eines Formulars

Beitrag von af0815 »

Kannst du ein einfaches Beispiel mit dem Problem erstellen, damit man das auch testen kann. Hat den zusätzlichen Vorteil, das man solche Beispiele auch in den Bugtracker geben kann, wenn nötig.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

zappa2
Beiträge: 43
Registriert: Do 28. Nov 2013, 09:54

Re: Unvollständige Anzeige eines Formulars

Beitrag von zappa2 »

Ich habe mal eine abgespeckte Minimal-Version zusammengepackt, Datenhandling und Logik entfernt.

Aber man sieht sehr schön die Problematik:
TabSheet4 wird von Anfang an richtig dargestellt, 1 und 2 erst, wenn man mal hin- und hergeschalten hat.
Dateianhänge
dll.zip
DLL-Projekt
(5.79 KiB) 104-mal heruntergeladen
test.zip
aufrufendes Testprojekt
(127.19 KiB) 104-mal heruntergeladen

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6199
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Unvollständige Anzeige eines Formulars

Beitrag von af0815 »

Ich sehe da kein Problem
Form in DLL
Form in DLL

Deinen Code heruntergeladen, die Pfade angepasst und compilert. das test.exe gestartet. Siehe Bild. Wenn ich weiterklicke ist in jedem Tab das drinnen was im Designer auch ist.

Lazarus 2.0.3 r61362 FPC 3.2.0 i386-win32-win32/win64 unter Win10/64 Pro mit aktuellen Patches

Edit: Jetzt habe ich es entdeckt. "Vorgabe Passwort-Intervall" fehlt !! und die Hintergrundsfarbe. Ok verstanden
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

zappa2
Beiträge: 43
Registriert: Do 28. Nov 2013, 09:54

Re: Unvollständige Anzeige eines Formulars

Beitrag von zappa2 »

Schon mal vielen Dank für Deine Mühe!

Erscheint doch in der Tat sehr eigenartig, oder?

Nachtrag: Und wenn Du Tabsheet2 als erstes anzeigst ist es noch deutlich schlimmer, was alles fehlt.

zappa2
Beiträge: 43
Registriert: Do 28. Nov 2013, 09:54

Problem gelöst!!!

Beitrag von zappa2 »

:D :D :D

Ich habe eine Lösung des Problems gefunden: Im FormActivate mache ich ein Invalidate.

Ist zwar ziemlich mit der Brechstange, aber es funktioniert. Unglaublich, wie viele Stunden ich an dem Problem gebastelt habe!!!

Antworten