Unvollständige Anzeige eines Formulars [gelöst]

Rund um die LCL und andere Komponenten

Unvollständige Anzeige eines Formulars [gelöst]

Beitragvon zappa2 » 21. Aug 2019, 11:59 Unvollständige Anzeige eines Formulars [gelöst]

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 27. Aug 2019, 10:29, insgesamt 1-mal geändert.
zappa2
 
Beiträge: 43
Registriert: 28. Nov 2013, 10:54

Beitragvon Warf » 21. Aug 2019, 20:24 Re: Unvollständige Anzeige eines Formulars

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).
Warf
 
Beiträge: 1217
Registriert: 23. Sep 2014, 17:46
Wohnort: Aachen
OS, Lazarus, FPC: Mac OSX 10.11 | Win 10 | FPC 3.0.0 | L trunk | 
CPU-Target: x86_64, i368, ARM
Nach oben

Beitragvon zappa2 » 21. Aug 2019, 22:09 Re: Unvollständige Anzeige eines Formulars

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.
zappa2
 
Beiträge: 43
Registriert: 28. Nov 2013, 10:54

Beitragvon af0815 » 22. Aug 2019, 08:47 Re: Unvollständige Anzeige eines Formulars

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).
af0815
 
Beiträge: 3764
Registriert: 7. Jan 2007, 11:20
Wohnort: Niederösterreich
OS, Lazarus, FPC: FPC 3.2 Lazarus 2.0 per fpcupdeluxe | 
CPU-Target: 32Bit (64Bit)
Nach oben

Beitragvon zappa2 » 22. Aug 2019, 18:06 Re: Unvollständige Anzeige eines Formulars

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: 28. Nov 2013, 10:54

Beitragvon zappa2 » 22. Aug 2019, 18:36 Re: Unvollständige Anzeige eines Formulars

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.
zappa2
 
Beiträge: 43
Registriert: 28. Nov 2013, 10:54

Beitragvon h-elsner » 22. Aug 2019, 20:15 Re: Unvollständige Anzeige eines Formulars

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
h-elsner
 
Beiträge: 63
Registriert: 24. Jul 2012, 15:42
Wohnort: Illertissen
OS, Lazarus, FPC: LINUX Mint18.3, Win10, Lazarus 1.8, FPC3.0.4 | 
CPU-Target: 64Bit
Nach oben

Beitragvon af0815 » 22. Aug 2019, 20:37 Re: Unvollständige Anzeige eines Formulars

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).
af0815
 
Beiträge: 3764
Registriert: 7. Jan 2007, 11:20
Wohnort: Niederösterreich
OS, Lazarus, FPC: FPC 3.2 Lazarus 2.0 per fpcupdeluxe | 
CPU-Target: 32Bit (64Bit)
Nach oben

Beitragvon zappa2 » 22. Aug 2019, 20:50 Re: Unvollständige Anzeige eines Formulars

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: 28. Nov 2013, 10:54

Beitragvon zappa2 » 22. Aug 2019, 20:58 Re: Unvollständige Anzeige eines Formulars

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.
zappa2
 
Beiträge: 43
Registriert: 28. Nov 2013, 10:54

Beitragvon af0815 » 23. Aug 2019, 07:13 Re: Unvollständige Anzeige eines Formulars

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).
af0815
 
Beiträge: 3764
Registriert: 7. Jan 2007, 11:20
Wohnort: Niederösterreich
OS, Lazarus, FPC: FPC 3.2 Lazarus 2.0 per fpcupdeluxe | 
CPU-Target: 32Bit (64Bit)
Nach oben

Beitragvon zappa2 » 23. Aug 2019, 07:51 Re: Unvollständige Anzeige eines Formulars

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) 4-mal heruntergeladen
test.zip
aufrufendes Testprojekt
(127.19 KiB) 4-mal heruntergeladen
zappa2
 
Beiträge: 43
Registriert: 28. Nov 2013, 10:54

Beitragvon af0815 » 23. Aug 2019, 13:42 Re: Unvollständige Anzeige eines Formulars

Ich sehe da kein Problem
FormInDLL01.JPG
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).
af0815
 
Beiträge: 3764
Registriert: 7. Jan 2007, 11:20
Wohnort: Niederösterreich
OS, Lazarus, FPC: FPC 3.2 Lazarus 2.0 per fpcupdeluxe | 
CPU-Target: 32Bit (64Bit)
Nach oben

Beitragvon zappa2 » 23. Aug 2019, 17:03 Re: Unvollständige Anzeige eines Formulars

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: 28. Nov 2013, 10:54

Beitragvon zappa2 » 23. Aug 2019, 19:04 Problem gelöst!!!

: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!!!
zappa2
 
Beiträge: 43
Registriert: 28. Nov 2013, 10:54

» Weitere Beiträge siehe nächste Seite »
Nächste

Zurück zu Komponenten und Packages



Wer ist online?

Mitglieder in diesem Forum: MSN [Bot] und 3 Gäste

porpoises-institution
accuracy-worried