fpspreadsheet -> spreadsheet macht in Frame defektes lfm

Rund um die LCL und andere Komponenten
Antworten
Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6198
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:

fpspreadsheet -> spreadsheet macht in Frame defektes lfm

Beitrag von af0815 »

Hallo,

Gegeben aktuellen Trunk-Lazarus, stable fpc.

Ich habe ein Frame und eine Applikation die das Frame lädt, darinnen einige Komponenten, unter anderen ein Panel mit beinhalteten DBGrid, DS und Query. Jetzt lösche ich das DBGrid und fürge ein WorksheetGrid und eine WorkbookSource ein. Das nächste kompilieren geht gut. Dann speicher ich nochmals ab, beende Lazarus.
Beim nächsten Start von Lazarus kommt die Fehlermeldung:

Code: Alles auswählen

In Datei
C:\.....\irgendwas.lfm
Control '' has no parent window
Control '' has no parent window
 

und das LFM wird geöffnet. Wenn man sich das ansieht, so gibt es keinen Grund. Man sieht auch im DIFF das es keine Probleme geben sollte.

Hat wer einen Tipp für mich ?

Code: Alles auswählen

 Versuche/Frames/frschicht.lfm | 71 +++++++---------------------
 1 file changed, 17 insertions(+), 54 deletions(-)
 
diff --git a/Versuche/Frames/frschicht.lfm b/Versuche/Frames/frschicht.lfm
index 0a7f2a2..7f2d36f 100644
--- a/frschicht.lfm
+++ b/frschicht.lfm
@@ -90,66 +90,22 @@ inherited Schicht: TSchicht
     ClientHeight = 705
     ClientWidth = 1006
     TabOrder = 1
-    object DBGrid3: TDBGrid
+    object sWorksheetGrid1: TsWorksheetGrid
       Left = 1
       Height = 703
       Top = 1
       Width = 1004
+      FrozenCols = 0
+      FrozenRows = 0
+      ReadFormulas = False
+      WorkbookSource = sWorkbookSource1
       Align = alClient
-      Color = clWindow
-      Columns = <     
-        item
-          Title.Caption = 'A1'
-          Width = 100
-          FieldName = 'A1'
-        end     
-        item
-          Title.Caption = 'B1'
-          Width = 200
-          FieldName = 'B1'
-        end     
-        item
-          Title.Caption = 'C1'
-          Width = 100
-          FieldName = 'C1'
-        end     
-        item
-          Title.Caption = 'D1'
-          Width = 100
-          FieldName = 'D1'
-        end     
-        item
-          Title.Caption = 'E1'
-          Width = 100
-          FieldName = 'E1'
-        end     
-        item
-          Title.Caption = 'F1'
-          Width = 100
-          FieldName = 'F1'
-        end     
-        item
-          Title.Caption = 'G1'
-          Width = 100
-          FieldName = 'G1'
-        end     
-        item
-          Title.Caption = 'H1'
-          Width = 100
-          FieldName = 'H1'
-        end     
-        item
-          Title.Caption = 'I1'
-          Width = 100
-          FieldName = 'I1'
-        end>
-      DataSource = DS_Schicht
-      Options = [dgEditing, dgIndicator, dgColumnResize, dgColumnMove, dgColLines, dgRowLines, dgTabs, dgAlwaysShowSelection, dgConfirmDelete, dgCancelOnExit]
-      ReadOnly = True
+      AutoAdvance = aaDown
+      ColCount = 27
+      DefaultColWidth = 64
+      DefaultRowHeight = 22
+      RowCount = 101
       TabOrder = 0
-      TitleFont.Color = clWindowText
-      TitleFont.Height = -11
-      TitleFont.Name = 'MS Sans Serif'
     end
   end
   object DS_Schicht: TDataSource[2]
@@ -288,4 +244,11 @@ inherited Schicht: TSchicht
       Size = 200
     end
   end
+  object sWorkbookSource1: TsWorkbookSource[4]
+    AutoDetectFormat = False
+    FileFormat = sfUser
+    Options = []
+    left = 632
+    top = 224
+  end
 end
 


Edit:
Wenn ich die workbooksource lösche (im lfm und pas), dann Lazarus neu starte, so gibt es keinen Fehler.
Dann eine neue Workbooksource darauf, speichern, Lazarus schliessen, öffnen, kein Problem.
Dann das Workbookgrid und die Workbooksource verbinden, das Frame schliessen und neu öffnen -> Bumm und der Fehler ist da.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

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

Re: fpspreadsheet -> spreadsheet macht in Frame defektes lfm

Beitrag von wp_xyz »

Ist die Vorgeschichte (DBGrid löschen vor dem Einfügen von WorksheetGrid und WorkbookSource) nötig, um den Fehler zu reproduzieren? Kannst du vielleicht ein Minimalbeispiel erzeugen und hochladen, dass ich etwas zum Herumspielen habe?

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6198
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: fpspreadsheet -> spreadsheet macht in Frame defektes lfm

Beitrag von af0815 »

Ich werde es versuchen :-)
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6198
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: fpspreadsheet -> spreadsheet macht in Frame defektes lfm

Beitrag von af0815 »

Hier das Beispiel:

Bei mir ist das schon defekt. Einfach nur beim WorkBookgrid die Zuweisung des Workbooks rausnehmen und es geht wieder. Zur Laufzeit geht auch das, nur der Designer hat da Probleme.
Dateianhänge
Frames.zip
Testprojekt
(4.11 KiB) 32-mal heruntergeladen
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

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

Re: fpspreadsheet -> spreadsheet macht in Frame defektes lfm

Beitrag von wp_xyz »

Versuch's mal mit r5684. Oder zur Not kannst du auch in TsWorksheetGrid.Setup die Kommentarklammern um die folgende Code-Stelle entfernen:

Code: Alles auswählen

procedure TsCustomWorksheetGrid.Setup;
...
  if not HandleAllocated then
    //Avoid crash when accessing the canvas, e.g. in GetDefaultHeaderColWidth
    exit;
...

Die Tatsache, dass das auskommentiert war, bedeutet wahrscheinlich, dass diese Änderung irgendwelche Nebenwirkungen hatte - nur kann ich mich nicht mehr erinnern, was das war. Wir werden sehen...

Übrigens, in der letzten (jetzt schon älteren) Release-Version 1.6.2 von fpspreadsheet ist das in der Setup-Prozedur noch nicht vorhanden. Welche Version verwendest du?

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6198
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: fpspreadsheet -> spreadsheet macht in Frame defektes lfm

Beitrag von af0815 »

SVN 5607: fpspreadsheet: Inherit TCellIndicator from TCustomEdit (instead of TEdit) to publish only needed properties.

Für mich sieht es so aus, als wenn da irgendwo TForm als Parent erwartet wird und mit TFrame nicht klarkommt. Vor allen, weil ich ja dynamisch zuweise.


Sieht so aus, als gabs das schon mal
4668: fpspreadsheet: Fix crash if WorksheetGrid is used within a TFrame.

ist aber in 4674 wieder auskommentiert
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

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

Re: fpspreadsheet -> spreadsheet macht in Frame defektes lfm

Beitrag von wp_xyz »

Danke für den Hinweis und die Suche. Das Problem ist, dass nach dem Laden des Formulars ein leeres Grid erzeugt wird. Dabei wird die Routine Setup durchlaufen, die wegen Textgrößenbestimmung für die Spaltenbreite/Zeilenhöhe auf den Canvas zugreifen muss, was schief geht, wenn noch kein gültiges Handle existiert. Ich weiß nicht, warum ich die Zeile in r4674 wieder rausgenommen habe. Eigentlich kann sie nicht schaden, weil beim Erzeugen des Handle auch wieder Setup aufgerufen wird.

Hat der Patch das Problem bei dir gelöst?

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6198
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: fpspreadsheet -> spreadsheet macht in Frame defektes lfm

Beitrag von af0815 »

Danke,

ich hatte das 'setup' schon im Focus, darum habe ich mal geschaut wann das auskommentiert wurde. Ich betrachte das aktuell als 'Kopfwehtablette'. Warum ist das Handle ungültig, den auch das Frame ist ja ein 'Parent'. Ich nehme nur an, das nur nach einem TForm gesucht wird, nicht aber nach einem TFrame. Vor allen bei Tframe muss man ja unterscheiden, ob es zur Laufzeit oder zur Designzeit eingebunden ist.

Ich möchte Dir für Deine rasche und kompetente Hilfe die du in deiner Freizeit und Unentgeltlich leistest danken. Den meisten ist gar nicht bewusst, das man bei Lazarus ja nicht mit einer 'Firma' zu tun hat, sondern mit Personen die das ganze in ihrer spärlichen Freizeit machen.

Ich habe da ein gutes Beispiel: Wenn wer einen befreundeten Klempner oder Maler ruft, so ist es selbstverständlich, das man dem etwas für seine Hilfe gibt. Wenn es um Computer geht, glaubt jeder, das das ja umsonst ist, da kein Schmutz und Dreck anfällt. Schon komisch, was da viele Leute im Kopf haben. SCNR, aber das musste auch mal gesagt werden.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

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

Re: fpspreadsheet -> spreadsheet macht in Frame defektes lfm

Beitrag von wp_xyz »

Danke für die anerkennenden Worte. Der Vergleich mit dem Handwerker ist gut.

af0815 hat geschrieben:ich hatte das 'setup' schon im Focus, darum habe ich mal geschaut wann das auskommentiert wurde. Ich betrachte das aktuell als 'Kopfwehtablette'. Warum ist das Handle ungültig, den auch das Frame ist ja ein 'Parent'. Ich nehme nur an, das nur nach einem TForm gesucht wird, nicht aber nach einem TFrame. Vor allen bei Tframe muss man ja unterscheiden, ob es zur Laufzeit oder zur Designzeit eingebunden ist.

Ehrlich gesagt, mit den Details der Handles kenne ich mich nicht aus. Aber ich denke mir das so: Das Problem entsteht in TsWorksheetSource.Loaded, wo Setup indirekt aufgerufen wird. Bei einem zur Laufzeit erzeugten Frame hat das Grid zu diesem Zeitpunkt zwar einen Parent (den Frame), aber der Frame selbst hat noch keinen. Ich glaube, der Unterschied zwischen TFrame und TForm ist, dass TFrame nicht selbständig existieren kann, sondern nur in TForm eingebettet. Deshalb hat ein herrenloser Frame noch kein gültiges Handle, und daher auch die auf dem Frame enthaltenen WinControls nicht.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6198
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: fpspreadsheet -> spreadsheet macht in Frame defektes lfm

Beitrag von af0815 »

Ich habe nach der Durchsicht der Sourcen den starken verdacht, das damit zusmmenhängt das ein TFrame IMHO kein Paint hat im Gegensatz zu TForm.

Wäre es nicht besser es so zu lösen ?

Code: Alles auswählen

    if ShowHeaders and HandleAllocated then begin // <---- hier das : and HandleAllocated zusätzlich (2x)
      PrepareCanvasFont;  // Applies the zoom factor
      ColWidths[0] := GetDefaultHeaderColWidth;
      RowHeights[0] := GetDefaultRowHeight;
    end;
 


oder es gleich in der GetDefaultHeaderColWidth und GetDefaultRowHeight zu machen ?
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

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

Re: fpspreadsheet -> spreadsheet macht in Frame defektes lfm

Beitrag von wp_xyz »

Ich weiß nicht. Der schlimmste Nachteil der aktuellen Lösung wäre, dass Setup nie mehr ausgeführt wird, wenn kein gültiges Handle vorhanden ist. Deine Lösung würde bewirken, dass Teile von Setup auch ohne Handle ausgeführt werden. Das wäre aber trotzdem falsch, weil die Textgrößenbestimmung erforderlich ist und so übersprungen wird - nach dem Motto: Halb funktionieren ist besser als gar nicht funktionieren. Aber: Wenn später das Handle erzeugt wird, dann wird Setup sowieso automatisch aufgerufen und müsste nun alles abarbeiten, weil das Handle jetzt gültig ist (TsWorksheetGrid.CreateHandle). Also eigentlich kann gar nichts passieren (höchstens, dass Setup unnötig oft aufgerufen wird). Mein Problem ist nur, warum ich damals die fragliche Stelle wiederkommentiert habe - vielleicht war das nur testweise und ist später vergessen worden?

Antworten