Absturz beim Bewegen eines Forms

Für Fragen rund um die Ide und zum Debugger
JosefKoller
Beiträge: 115
Registriert: Sa 17. Mär 2007, 10:53

Absturz beim Bewegen eines Forms

Beitrag von JosefKoller »

Hallo,

ich hab zwar schon mit den Suchbegriffen "Absturz und Form" usw. nach meinem Problem gesucht. Ich finde aber nichts.

Deswegen meine Frage:

Ich habe Lazarus neu intalliert (Version 1.0.14). Dann ging ich daran einige Sachen dazuzuinstallieren (Zeos zum Beispiel oder LazReport).

Immer wenn ich mit der Maus das Form Fenster wegschieben will, um z. b. das Meldungsfenster besser im Blick zu haben stürzt die IDE ab.

IDE Absturz und nach Fehler suchen. Dann wieder Neustart von Lazarus und wieder das Gleiche. Sowie ich irgendwas verschiebe oder ein anderes Fenster anklicke, stürzt Lazarus ab. Das Abstürzen passiert auch, wenn ich ein "normales Projekt" bearbeite. Immer, wenn Lazarus werkelt und ich irgendwo rumschiebe oder rumklicke, stürzt es ab.

Meine Systemangaben:
Windows XP
Arbeitsspeicher 2GB
32 Bit

Hat jemand eine Idee, woran das liegen könnte?

Danke.

Josef

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

Re: Absturz beim Bewegen eines Forms

Beitrag von Michl »

Zur Fehlerursachensuche sind evtl. noch folgende Fragen interessant:

- Welche Version hattest Du zuvor benutzt und lief diese ohne Probleme?
- Hast Du diese Installation zuvor komplett entfernt oder 1.0.14 darüber installiert?
- Hast Du Lazarus 1.0.14 nochmal ohne die zusätzlichen Packages getestet und läuft dieses da stabil?

Code: Alles auswählen

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

JosefKoller
Beiträge: 115
Registriert: Sa 17. Mär 2007, 10:53

Re: Absturz beim Bewegen eines Forms

Beitrag von JosefKoller »

Hallo,
Michl hat geschrieben:Zur Fehlerursachensuche sind evtl. noch folgende Fragen interessant:

- Welche Version hattest Du zuvor benutzt und lief diese ohne Probleme?
- Hast Du diese Installation zuvor komplett entfernt oder 1.0.14 darüber installiert?
- Hast Du Lazarus 1.0.14 nochmal ohne die zusätzlichen Packages getestet und läuft dieses da stabil?
Ich hatte vorher 1.0.12, da war es genauso.

ich muß dazusagen, daß ich normalerweise Delphi benutze. Ich schaue ab und an nach Lazarus, um die Entwicklungsfortschritte zu beobachten.
Bei der Lazarus Vesion 12 dachte ich, naja, die kriegen diese Abstürze schon in den Griff. Aber bei 1.0.14 ist es immer noch so.

Dabei möchte ich dringenst umsteigen. Lazarus hat sich gemausert ohne Ende. Wenn ich da an meine ersten Tests denke. Das sind Welten. Angefangen von der Installation von packages bis zum Designer bei lazreport usw.

Vor Allem die Geschwindigkeit beim Aufbau eines Treeviews ist phantastisch. Bei Delphi brauche ich für 100 Items 15 Sekunden.

Mit Lazarus werden 1000 Knoten und dazu je Knoten 50 Subknoten in einem Wimpernschlag aufgebaut.

Nur diese blöden Abstürze, das ist blöd. Solltest mal nicht gespeichert haben, ist die ganze Tipperei umsonst gewesen.

Bei der Neuintallation kam die Abfrage, ob das alte Lazarus entfernt werden soll. Ich hab da mit ja geantwortet.

Nach den ersten Abstürzen hab ich nochmal neu intalliert und vorher unter appdata>local>lazarus alles gelöscht.

Half aber auch nicht.

Die beiden Packages, die ich dazu installiert habe (LazReport und Zeos) können es ja kaum sein. Denn, wie gesagt, bei 1.0.12, stürzte Lazarus auch ab.

Mehr kann ich jetzt auch nicht zur genaueren Eingrenzung sagen.

Danke.

Josef

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

Re: Absturz beim Bewegen eines Forms

Beitrag von Michl »

Leider kann ich Dir mit diesen Informationen nicht wirklich weiterhelfen. Als es bei mir Probleme gab, lag das immer an verkorksten Installationen (Verzeichnis unglücklich gewählt oder Restdaten einer alten Installation). Evtl. gibt es ein Konflikt mit einer anderen Software?!
Ich selber nutze Win7. Auch wenn Dir das nicht hilft, auf Win7 (zumindest, was ich so treibe) ist Lazarus so stabil, dass ich mich gar nicht (mehr) daran erinnern kann, dass mir die IDE gecrasht ist.

Habe auch mal im Netz geschaut, das Problem (unter Win XP) scheint recht selten zu sein.

Versuchen könntest Du noch Lazarus zu löschen, dann per Hand nach Überbleibseln, evtl. auch im Registry, zu suchen und diese zu entfernen und in einem neuen Verzeichnis (z.B. C:\Lazarus oder C:\Laz - am besten, in eins, was es bis dato noch nicht gab), zu installieren. Weiter könntest Du evtl. noch Lazarus-Trunc (mit FPC-Trunc) probieren zu installieren. Weiss aber nicht, ob Dir irgend was davon weiterhilft.

Falls Dir sonst keiner weiter helfen kann, könntest Du noch im englischen Forum nachfragen oder einen Bugreport erstellen - da wäre es aber eigentlich günstig, wenn Du sagen könntest, welche die letzte ordentlich funktionierende Version war.

Code: Alles auswählen

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

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

Re: Absturz beim Bewegen eines Forms

Beitrag von wp_xyz »

Benutzt du Lazarus im Original oder hast du Zusatzpackages installiert? Wenn ja, welche? Ich kann mir nur vorstellen, dass du ein fehlerhaftes Package installiert hast. Ansonsten läuft Lazarus einwandfrei, auch unter XP.

Ich will in einem Lazarus-Forum Delphi nicht schön reden, aber dass Delphi's TreeView 100 Items in 15 Sekunden aufbaut, entspricht nicht meiner Erfahrung, auch als ich noch einen Pentium-II hatte nicht. Benutzt du TreeView.Items.BeginUpdate/EndUpdate vor und nach dem Füllen des Treeview, um das Neuzeichnen nach jeder Änderung zu unterbinden (http://users.iafrica.com/d/da/dart/Delp ... _eg06.html)?

JosefKoller
Beiträge: 115
Registriert: Sa 17. Mär 2007, 10:53

Re: Absturz beim Bewegen eines Forms

Beitrag von JosefKoller »

Hallo,
Michl hat geschrieben:Leider kann ich Dir mit diesen Informationen nicht wirklich weiterhelfen. Als es bei mir Probleme gab, lag das immer an verkorksten Installationen (Verzeichnis unglücklich gewählt oder Restdaten einer alten Installation). Evtl. gibt es ein Konflikt mit einer anderen Software?!
Ich selber nutze Win7. Auch wenn Dir das nicht hilft, auf Win7 (zumindest, was ich so treibe) ist Lazarus so stabil, dass ich mich gar nicht (mehr) daran erinnern kann, dass mir die IDE gecrasht ist.

Habe auch mal im Netz geschaut, das Problem (unter Win XP) scheint recht selten zu sein.

Versuchen könntest Du noch Lazarus zu löschen, dann per Hand nach Überbleibseln, evtl. auch im Registry, zu suchen und diese zu entfernen und in einem neuen Verzeichnis (z.B. C:\Lazarus oder C:\Laz - am besten, in eins, was es bis dato noch nicht gab), zu installieren. Weiter könntest Du evtl. noch Lazarus-Trunc (mit FPC-Trunc) probieren zu installieren. Weiss aber nicht, ob Dir irgend was davon weiterhilft.

Falls Dir sonst keiner weiter helfen kann, könntest Du noch im englischen Forum nachfragen oder einen Bugreport erstellen - da wäre es aber eigentlich günstig, wenn Du sagen könntest, welche die letzte ordentlich funktionierende Version war.
Ich hab jetzt alles, was irgendwie lazarus auf meiner Festplatte und in der Registry gelöscht. Dann den Rechner neu gestartet und dann Lazarus wieder installiert. Zur Sicherheit auch ein anders lautender Verzeichnisname.

Was soll ich sagen: Es stürzt nichts mehr ab. Weder beim Bewegen von Formularen noch beim Kopieren und Einfügen von Komponenten von einem in ein anderes Formular.

Vielleicht sollte ich noch erwähnen, daß in der Registry etliche Hinweise auf lazarus.exe und old-lazarus.exe drin waren. Vielleicht lag es an diesen beiden Lazarus Varianten in der Registry.

Ist aber jetzt egal.

So wie es ausschaut, funktioniert zumindest mal die Grundversion.

danke.

Ciao

Josef

JosefKoller
Beiträge: 115
Registriert: Sa 17. Mär 2007, 10:53

Re: Absturz beim Bewegen eines Forms

Beitrag von JosefKoller »

wp_xyz hat geschrieben:Benutzt du Lazarus im Original oder hast du Zusatzpackages installiert? Wenn ja, welche? Ich kann mir nur vorstellen, dass du ein fehlerhaftes Package installiert hast. Ansonsten läuft Lazarus einwandfrei, auch unter XP.

Ich will in einem Lazarus-Forum Delphi nicht schön reden, aber dass Delphi's TreeView 100 Items in 15 Sekunden aufbaut, entspricht nicht meiner Erfahrung, auch als ich noch einen Pentium-II hatte nicht. Benutzt du TreeView.Items.BeginUpdate/EndUpdate vor und nach dem Füllen des Treeview, um das Neuzeichnen nach jeder Änderung zu unterbinden (http://users.iafrica.com/d/da/dart/Delp ... _eg06.html)?
Meine "Fehlerbehebung" hab ich in der vorigen Antwort geschildert.

Noch kurz zum TreeView.

Ich schätze mal, die sehr unterschiedlich langen Aufbauzeiten kommen aus den Datenbankverknüpfungen.

das treeView wird mit Datenbankeinträgen gefüllt. In Delphi 6 muß ich z. b. bei UTF8 DB's, wie SQLite, alles bei GetText und SetText konvertieren. Bei den String's im Treeview nochmals.

Ich schätz mal, diese Konvertierei ist das Übel.

Bei Lazarus fällt das Umwandeln weg. Da werden die Original-DB-Tabellen aus SQLite blitzsauber ohne Umwandlung in Grid's, usw. angezeigt.

Ich probier's aber dann nochmal aus, wie groß die Aufbauzeitunterschiede sind. Das Wichtigst war erst Mal, daß Lazarus überhaupt vernünftig läuft.

Danke

Ciao

Josef

JosefKoller
Beiträge: 115
Registriert: Sa 17. Mär 2007, 10:53

Re: Absturz beim Bewegen eines Forms

Beitrag von JosefKoller »

Hallo,

der Absturz scheint durch die Installation von "größeren" Packages verursacht zu werden.

Ich hab Lazreport installiert und während des Installationsprozesses überall hingeklickt. die verschiedenen Fenster größer und kleiner gezogen.

War kein Problem.

dann hab ich ZEOS (7.1.3) installiert. auch während dieses Installationsvorganges machte ich wieder das Gleiche (Fenster größer gezogen, in das Nachrichtenfenster geklickt, usw.).

Da wurde dann der Absturz der IDE verursacht.

Nach Neustart hab ich ZEOS wieder installiert. Dieses Mal klickte ich nur auf Kompilieren und dann auf Installieren. ansonsten blick der Mauszeiger unverändert. Es verlief alles reibungslos.

Bis jetzt keine weiteren Abstürze mehr.

ciao

Josef

JosefKoller
Beiträge: 115
Registriert: Sa 17. Mär 2007, 10:53

Re: Absturz beim Bewegen eines Forms

Beitrag von JosefKoller »

Hallo,

es scheint eindeutig Zeos 7.1.3 zu sein.

sobald einer Connection Kompo auf einer From ist, man diese mit einer Dankenbank verbindet und dann die form größer oder kleiner zieht oder bewegt, dann stürzt Lazarus ab.

Ich versuchs mal mit einer anderen, älteren Version.

ciao

Josef

hde
Beiträge: 556
Registriert: Mi 11. Aug 2010, 02:56

Re: Absturz beim Bewegen eines Forms

Beitrag von hde »

Ich habe div. Versionen von Lazarus auf etlichen XPs, Win7(64) und MACs laufen, alle mit Zeos. Nirgendwo tauchte dein Problem auf. Allerdings hab ich 1.0.14 mit Zeos 7.1.3 (noch) nicht laufen, wohl aber etliche SVN 1.1 ( 1.2 RC macht bei mir leider Probs) und bei Zeos sind leider die div. Versionen nicht ganz kompatibel.
Ich werde 1.0.14 und 7.1.3 mal installieren sobald ich etwas Luft hab.

Wenn du viele Pakete zusätzlich brauchst schau dir mal die CT Versionen an, die haben massig packages dabei, meist die neuesten Versionen und installieren (bei mir bisher) problemlos alles in einem Zug.

hde

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

Re: Absturz beim Bewegen eines Forms

Beitrag von wp_xyz »

Ich nehme an, die hast keine Zweitinstallation von Lazarus. Dann steht die Konfiguration von Lazus im Ordner c:\Users\<username>\AppData\Local\Lazarus (ansonsten in dem, der im Kommandozeilenparameter primary_config_path, oder pcp, angegeben ist oder in der Datei Lazarus.cfg steht). In ähnlich gelagerten Fällen hat mir geholfen, diesen Ordner zu löschen oder umzubenennen (für spätere Wiederverwendung). Damit verschwinden auch alle installierten Packages. Zusätzlich solltest du auch noch den Order lib unter (ZEOS)\packages\lazarus löschen, dort stehen die übersetzten ppu's aus der aktuellen Installation. (wobei "(ZEOS)" für das Verzeichnis steht, in das du die ZEOS-Bibliothek installiert hast).

Nochmals: auch ich habe ZEOS in Lazarus installiert, und das läuft einwandfrei. Dein Problem muss zu lösen sein.

JosefKoller
Beiträge: 115
Registriert: Sa 17. Mär 2007, 10:53

Re: Absturz beim Bewegen eines Forms

Beitrag von JosefKoller »

Hallo,
wp_xyz hat geschrieben:Ich nehme an, die hast keine Zweitinstallation von Lazarus. Dann steht die Konfiguration von Lazus im Ordner c:\Users\<username>\AppData\Local\Lazarus (ansonsten in dem, der im Kommandozeilenparameter primary_config_path, oder pcp, angegeben ist oder in der Datei Lazarus.cfg steht). In ähnlich gelagerten Fällen hat mir geholfen, diesen Ordner zu löschen oder umzubenennen (für spätere Wiederverwendung). Damit verschwinden auch alle installierten Packages. Zusätzlich solltest du auch noch den Order lib unter (ZEOS)\packages\lazarus löschen, dort stehen die übersetzten ppu's aus der aktuellen Installation. (wobei "(ZEOS)" für das Verzeichnis steht, in das du die ZEOS-Bibliothek installiert hast).

Nochmals: auch ich habe ZEOS in Lazarus installiert, und das läuft einwandfrei. Dein Problem muss zu lösen sein.
Echt gut hier in diesem Forum. Keiner putzt einen runter, so nach dem Motto: "du stellst Dich nur zu blöd an!"
wp_xyz hat geschrieben:Zusätzlich solltest du auch noch den Order lib unter (ZEOS)\packages\lazarus
Danke, werd ich mir merken. Aber da ich Lazarus gestern sowieso öfters neu installierte, war das dann kein Problem mehr. Das mit den AppData Dateien wußte ich und hab sie auch gelöscht.

Meine Abstürze: So einfach, wie ich mir eine Problemlösung vorgestellt hatte, ist es nun doch nicht. Ich bracuhe ewig um auf einer form halbwegs was zustande zu bringen. Komisch ist nur, daß es nur zu Abstürzen kommt, wenn ich an den Lazarusfenstern was mache (also den Objektinspektor breiter ziehe oder Komponenten von einer Form kopiere und in eine andere einfüge oder wenn ein Propertyeditor offen ist und ich den verschieben will und sowas. Wenn ich in andere Anwendungen wechsle, also z. b. in mein offenes EMailprogramm, passiert nichts.

Wie gesagt, immer nur, wenn ich was an den Lazarusfenstern mache. Ob das wirklich an Windows mit seinen Fensterhandlen liegt oder nicht doch eher ein Lazarusproblem ist, kann ich einfach nicht beurteilen. Da es nur in Lazarus passiert, schätz ich einfach mal, daß doch Lazarus der Auslöser ist.

Noch schnell zum Treeview:
eigentlich wollte ich zu Vergleichszwecken auf die Schnelle zwei Anwendungen machen (einmal Delphi, einmal Lazarus). Nur jeweils eine Form mit Zugriff auf die gleichen Tabellen.

Aber das ist leichter gesagt als getan. Bis ich in Lazarus einige ZEOS Querys und so auf dem Form habe und die entsprechenden Abfragen und Verknüpfungen setze wird es späte Nacht. Ich bin mehr am Aufpassen, daß ich nach edem zweiten Tastenschlag speiche als das ich sonst vorwärts komme.

Das treeview füllen ist eigentlich nix weltbewegendes:

Mit dieser ersten Prozedure fülle ich das treeview nur mit dem Hauptknoten (weils eben solange dauert)
Mit der zweiten Prozedure füge ich dann die Subknoten dazu, wenn der jeweilige Hauptknoten selektiert wird.

Code: Alles auswählen

 
 
procedure Tauftraguebersicht.fillTVAufDetail;
begin
  try
    try
      sPanel4.Visible := True;
      TVAufDetail.Visible := False;
      screen.Cursor := crHourGlass;
      TVAufDetail.Items.Clear;
      TVAufDetail.Update;
      TVAufDetail.Items.BeginUpdate;
 
      with TVAufDetail.Items do
      begin
        DMbeeBook.ZQAuftragOrders.First;
        while not DMbeeBook.ZQAuftragOrders.Eof do
        begin
          New(OrdIdx);
          OrdIdx^[1] := '-';
          //Der Anfangsbuchstabe, wie T, M oder N für orderstype, ordersmessage, ordersnotice
          OrdIdx^[2] := DMbeeBook.ZQAuftragOrdersord_id.AsString;
          // die ID von orders
          OrdIdx^[3] := '-'; // die id von orderstype
          OrdIdx^[4] := '-'; // die id von orderstypearticle
          OrdIdx^[5] := '-'; // die id von ordersmessage
          OrdIdx^[6] := '-'; // die id von ordersnotice
 
          nodeadress := AddObject(nil,
            CharsetConversion(FormatDateTime('dd.mm.yyyy',
            DMbeeBook.ZQAuftragOrders.FieldByName('ord_datum').AsVariant) +
            ':   '
            +
            DMbeeBook.ZQAuftragOrders.FieldByName('ord_firma').Value + ' ' +
            DMbeeBook.ZQAuftragOrders.FieldByName('ord_sel_anrede').Value + ' '
            +
            DMbeeBook.ZQAuftragOrders.FieldByName('ord_vorname').Value + ' ' +
            (DMbeeBook.ZQAuftragOrders.FieldByName('ord_nachname').Value) + ' '
            +
            DMbeeBook.ZQAuftragOrders.FieldByName('ord_strasse').Value + ' ' +
            DMbeeBook.ZQAuftragOrders.FieldByName('ord_plz').Value + ' ' +
            DMbeeBook.ZQAuftragOrders.FieldByName('ord_ort').Value + ' ' +
            DMbeeBook.ZQAuftragOrders.FieldByName('ord_land').Value, UTF_8,
            CP1252),
            OrdIdx);
          DMbeeBook.ZQAuftragOrders.Next;
        end;
 
      end;
    finally
      TVAufDetail.Items.EndUpdate;
      TVAufDetail.Visible := True;
      if TVAufDetail.Items.Count > 0 then
      begin
        TVAufDetail.SetFocus;
        if nodeSelected <> nil then
        begin
          RestoreTree(TVAufDetail);
        end
        else
        begin
          TVAufDetail.Items.Item[0].Focused := true;
          TVAufDetail.Items.Item[0].Selected := true;
          TVAufDetail.Items.Item[0].Expand(true);
        end;
      end;
      sPanel4.Visible := False;
      screen.Cursor := crDefault;
    end;
  except
    on E: Exception do
    begin
      MessageDlg('Fehler 200120141833: ' + E.ClassName + ', Meldung: ' +
        e.Message,
        mtError, [mbOK], 0);
    end;
  end;
end;
 
 
so ungefähr:

Code: Alles auswählen

 
 
procedure Tauftraguebersicht.fillSubTVAufDetail;
begin
  with TVAufDetail.Items do
  begin
    if (nodeSelected.Level = 0) and (nodeSelected.HasChildren = False) then
    begin
      nodesubheaderschrift := AddChildObject(nodeSelected, 'Schriftverkehr',
        OrdIdx);
 
      DMbeeBook.ZQAuftragOrdersType.First;
      while not DMbeeBook.ZQAuftragOrdersType.Eof do
      begin
        New(OrdTypeIdx);
        OrdTypeIdx^[1] := 'T';
        //Der Anfangsbuchstabe, wie T, M oder N für orderstype, ordersmessage, ordersnotice
        OrdTypeIdx^[2] := DMbeeBook.ZQAuftragOrdersord_id.AsString;
        // die ID von orders
        OrdTypeIdx^[3] := DMbeeBook.ZQAuftragOrdersTypetype_id.AsString;
        // die id von orderstype
        OrdTypeIdx^[4] := '-'; // die id von orderstypearticle
        OrdTypeIdx^[5] := '-'; // die id von ordersmessage
        OrdTypeIdx^[6] := '-'; // die id von ordersnotice
        nodesubschrift := AddChildObject(nodesubheaderschrift,
          CharsetConversion(DMbeeBook.ZQAuftragOrdersTypetype_art.AsString +
          ' vom: ' +
          DMbeeBook.ZQAuftragOrdersTypetype_datum.AsString, UTF_8, CP1252),
          OrdTypeIdx);
 
        OrdTypeIdx^[3] := DMbeeBook.ZQAuftragOrdersTypetype_id.AsString;
        nodesubarticlehead := AddChildObject(nodesubschrift, 'Artikel',
          OrdTypeIdx);
 
        DMbeeBook.ZQAuftragOrdersTypeArtikel.First;
        while not DMbeeBook.ZQAuftragOrdersTypeArtikel.Eof do
        begin
          New(OrdTypeArticleIdx);
          OrdTypeArticleIdx^[1] := '-';
          //Der Anfangsbuchstabe, wie T, M oder N für orderstype, ordersmessage, ordersnotice
          OrdTypeArticleIdx^[2] := DMbeeBook.ZQAuftragOrdersord_id.AsString;
          // die ID von orders
          OrdTypeArticleIdx^[3] :=
            DMbeeBook.ZQAuftragOrdersTypetype_id.AsString;
          ; // die id von orderstype
          OrdTypeArticleIdx^[4] :=
            DMbeeBook.ZQAuftragOrdersTypeArtikelart_id.AsString;
          ; // die id von orderstypearticle
          OrdTypeArticleIdx^[5] := '-'; // die id von ordersmessage
          OrdTypeArticleIdx^[6] := '-'; // die id von ordersnotice
 
          //New(OrdTypeArticleIdx);
          //OrdTypeArticleIdx^ := DMbeeBook.ZQAuftragOrdersTypeArtikelart_id.AsString;
          nodesubarticle := AddChildObject(nodesubarticlehead,
            CharsetConversion(DMbeeBook.ZQAuftragOrdersTypeArtikelart_anzahl.AsString + ' ' +
            DMbeeBook.ZQAuftragOrdersTypeArtikelart_einheit.AsString + ' ' +
            DMbeeBook.ZQAuftragOrdersTypeArtikelart_bezeichnung.AsString + ', '
            +
            DMbeeBook.ZQAuftragOrdersTypeArtikelart_bezeichnungzusatz.AsString,
            UTF_8, CP1252),
            OrdTypeArticleIdx);
          DMbeeBook.ZQAuftragOrdersTypeArtikel.Next;
        end; // typearticle
        DMbeeBook.ZQAuftragOrdersType.Next;
      end; //while orderstype;
 
      nodesubmessagehead := AddChildObject(nodeSelected, 'Mitteilungen',
        OrdIdx);
      DMbeeBook.ZQAuftragOrdersMessage.First;
      while not DMbeeBook.ZQAuftragOrdersMessage.Eof do
      begin
        New(OrdmessageIdx);
        OrdMessageIdx^[1] := 'M';
        //Der Anfangsbuchstabe, wie T, M oder N für orderstype, ordersmessage, ordersnotice
        OrdMessageIdx^[2] := DMbeeBook.ZQAuftragOrdersord_id.AsString;
        // die ID von orders
        OrdMessageIdx^[3] := '-'; // die id von orderstype
        OrdMessageIdx^[4] := '-'; // die id von orderstypearticle
        OrdMessageIdx^[5] := DMbeeBook.ZQAuftragOrdersMessagemes_id.AsString;
        // die id von ordersmessage
        OrdMessageIdx^[6] := '-'; // die id von ordersnotice
        //New(OrdMessageIdx);
        //OrdMessageIdx^ := 'M' + DMbeeBook.ZQAuftragOrdersMessagemes_id.AsString;
        nodesubmessage := AddChildObject(nodesubmessagehead,
          CharsetConversion(DMbeeBook.ZQAuftragOrdersMessagemes_header.AsString
          +
          ' vom: ' +
          DMbeeBook.ZQAuftragOrdersMessagemes_datum.AsString, UTF_8,
          CP1252), OrdMessageIdx);
        DMbeeBook.ZQAuftragOrdersMessage.Next;
      end;
 
      nodesubnoticehead := AddChildObject(nodeSelected, 'Notizen', OrdIdx);
      DMbeeBook.ZQAuftragOrdersNotice.First;
      while not DMbeeBook.ZQAuftragOrdersNotice.Eof do
      begin
        New(OrdNoticeIdx);
        OrdNoticeIdx^[1] := 'N';
        //Der Anfangsbuchstabe, wie T, M oder N für orderstype, ordersmessage, ordersnotice
        OrdNoticeIdx^[2] := DMbeeBook.ZQAuftragOrdersord_id.AsString;
        // die ID von orders
        OrdNoticeIdx^[3] := '-'; // die id von orderstype
        OrdNoticeIdx^[4] := '-'; // die id von orderstypearticle
        OrdNoticeIdx^[5] := '-'; // die id von ordersmessage
        OrdNoticeIdx^[6] := DMbeeBook.ZQAuftragOrdersNoticenot_id.AsString;
        // die id von ordersnotice
        nodesubnotice := AddChildObject(nodesubnoticehead,
          CharsetConversion(DMbeeBook.ZQAuftragOrdersNoticenot_header.AsString +
          ' vom: ' +
          DMbeeBook.ZQAuftragOrdersNoticenot_datum.AsString, UTF_8, CP1252),
          OrdNoticeIdx);
        DMbeeBook.ZQAuftragOrdersNotice.Next;
      end;
    end;
    //TVAufDetail.Update;
  end;
end;
 
 
Wie ich sagte, schon alle das Füllen des ersten Knotens dauert mit rund 100 Datensätzen schon an die 15 Sekunden.

Wie hier so schreibe fällt mir ein, daß ich im Change Ereignis drin habe, daß wenn selektiert wird, soll mit locate die Tabelle auf den Datensatz gesetzt werden, deren ID ich in den Idx Indexen beim Füllen speichere.

Vielleicht wird im OnChange mit jedem Füllen des Knotens, also mit jedem While-Durchlauf auch das selected = true geprüft und quasi mit jedem Durchlauf das locate gestartet.

Muß mal einen Breakpoint im OnChange setzen, ob der mit jedem While not eof.... next in If ... selected = true reinspringt und damit jedes Mal locate aufruft.

Wenn mir nur das ganze Zeugs nicht dauert abstürzen würde.

Ciao

Josef

JosefKoller
Beiträge: 115
Registriert: Sa 17. Mär 2007, 10:53

Re: Absturz beim Bewegen eines Forms

Beitrag von JosefKoller »

Nachtrag:

Hab grad schnell in der Delphi Anwendung in Onchange beim treeview ein Breakpoint gesetzt.

Nein, es wird nicht nach jeder while-Schleife "Locate" aufgerufen. Es dauert einfach schlichtweg solange, ohne das ich wüßte was an den obigen Prozeduren so für eine "Verlangsamung sorgen könnte.

Ciao

Josef

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

Re: Absturz beim Bewegen eines Forms

Beitrag von wp_xyz »

Ich hätte mir zwar ein kleines Projekt gewünscht, das ich selbst mit dem Debugger abklopfen kann. Aber wie dem auch sei: Hast du andere Datenbank-Controls mit den Datasets verknüpft, die zum Aufbau des Trees durchlaufen werden? (Besonders "dankbar" wäre ein DBGrid...) Wenn ja dann solltest du das Durchlaufen der Datasets mit DisableControls/EnableControls umgeben, damit auch hier Neuzeichnen unterdrückt wird. Außerdem solltest du alle Event-Handler aushängen, die beim Durchlaufen unnötigerweise aufgerufen werden, z.B. Before/AfterScroll, aber das erwähnte OnChange erscheint mir auch so ein Kandidat. Weiterhin ist mir als Geschwindigkeitsbremse noch aufgefallen, dass du in den Schleifen mit "FieldByName" auf die Tabellenfelder zugreifst. Da dabei jedesmal alle Felder nach dem gewünschten durchsucht werden müssen, kann das bei großen Tabellen gehörig unnötige Zeit kosten. Besser ist, mit persistenten Feldern zu arbeiten, oder die Felder vor der Schleife zu suchen und in Variablen abzulegen.

Selbst falls diese Ideen helfen sollten, das Delphi-Programm zu beschleunigen, ist natürlich nicht klar, warum Lazarus so viel schneller ist...

Code: Alles auswählen

 
procedure Tauftraguebersicht.fillTVAufDetail;
// neu:
var
  SavedAuftragOrdersAfterScroll: TDatasetNotifyEvent;
begin
  try
    // neu:
    SavedAuftragOrdersAfterScroll := DMbeeBook.ZQAuftragOrders.AfterScroll;
    DBbeeBook.ZQAuftragOrders.DisbleControls;
 
    try
      sPanel4.Visible := True;
      TVAufDetail.Visible := False;
      screen.Cursor := crHourGlass;
      TVAufDetail.Items.Clear;
      TVAufDetail.Update;
      TVAufDetail.Items.BeginUpdate;  
 
      // neu:
      DMbeeBook.ZQAuftragOrders.AfterScroll := nil;
 
      with TVAufDetail.Items do
      begin
 
        // Hier weiter wie bei dir
 
      end;
 
    finally
      // neu
      DMbeeBook.ZQAuftragOrders.AfterScroll := AuftragOrdersAfterScroll;
      DMbeeBook.ZQAuftragOrders.EnableControls;
 
      TVAufDetail.Items.EndUpdate;
      TVAufDetail.Visible := True;
      if TVAufDetail.Items.Count > 0 then
      begin
        TVAufDetail.SetFocus;
        if nodeSelected <> nil then
        begin
          RestoreTree(TVAufDetail);
        end
        else
        begin
          TVAufDetail.Items.Item[0].Focused := true;
          TVAufDetail.Items.Item[0].Selected := true;
          TVAufDetail.Items.Item[0].Expand(true);
        end;
      end;
      sPanel4.Visible := False;
      screen.Cursor := crDefault;
    end;
  except
    on E: Exception do
    begin
      MessageDlg('Fehler 200120141833: ' + E.ClassName + ', Meldung: ' +
        e.Message,
        mtError, [mbOK], 0);
    end;
  end;
end;
 

JosefKoller
Beiträge: 115
Registriert: Sa 17. Mär 2007, 10:53

Re: Absturz beim Bewegen eines Forms

Beitrag von JosefKoller »

Hallo,

Danke für Deine Mühe.

Hab grad in der Delphi Anwendung einen Timer gesetzt. Mit Deiner Verbesserung disable/enablecontrols kommt das Füllen jetzt auf 4 sec und etwas.
Das Ausklinken von Scroll brachte nichts. Ich hatte auch unter diesen Events nichts drin. Es ist auch kein Grid oder sowas dazwischen.

Einfach nur das Treeview und eben beim Activate das Füllen des ersten Knotens. Im Onchange hab ich ein paar Breakpoints gesetzt. Da passiert nichts während des Füllens. Also von 15 sec. auf 4 sec. ist schon mal was.

Aber eben noch immer zu langsam. Es sind ja nur an die 100 DS. Wenn das mal 1000 oder 10000 werden, dann kann ich das Treeview einfach nicht verwenden.

Warum mit Lazarus 10000 Knoten in einem Schlag erzeugt werden ist mir ein Rätsel. In Lazarus hab ich aber eine for-Schleife genommen (auch mit addchildobject und einem Index hindran. Nur halt einen fiktivem text, statt der Tabellenwerte), weil mir die Erzeugerei von ZEOS Komponenten zwecks Verbindung zur DB wegen der Abstürze mittlerweile doch auf den Geist gehen.

Ich will das Ganze aber trotz der Abstürze mit Lazarus realisieren. Es ist einfach schneller und diese UTF-8 Sachen kann ich vollkommen außer Acht lassen.

Nur es fehlen mir in Lazarus so liebgewordene Tools wie CNPack oder GExperts. In Lazarus hab ich z.b. nur eine Codevervollständigung, wenn ich erstmal den Komponentennamen richtig hinschreibe und einen Punkt setze. Auch Funktions- oder Prozedureinhalte werden mir als Orientierung nicht angezeigt. Mit Delphi wird mir vorwärts und rückwärts nach 2 oder 3 Buchstaben alles angezeigt, weiß es dazu zu verwenden gibt. Nach einer Klammer kommt, welche Paramter in welcher Form erwartet werden, usw.

Vielleicht kannst du mir mit so einem Tool für Lazarus auch weiterhelfen. Ich find nix Rechtes im Netz. CnPack gibt es nicht für Lazarus. Was Anderes finde ich nicht.

GExperts (Code neu formatieren z. b.) für Lazarus find ich auch nicht.

Wie gesagt, lauter so Kleinigkeiten, an die man sich sehr schnell gewöhnt.

Danke dir nochmals für Deine Hilfe.

Ciao

Josef

Antworten