Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Die Delphi-IDE (https://www.delphipraxis.net/62-die-delphi-ide/)
-   -   Debugging in der IDE (https://www.delphipraxis.net/163996-debugging-der-ide.html)

foobar3000 24. Okt 2011 21:41


Debugging in der IDE
 
Hi,


habe seit Jahren nicht mehr unter Windows programmiert, sondern Linux mit Python, Perl, Java, ... etc.

Aktuelle Projekte sind unter Windows (XP/7) und Delphi XE.


1. Gibt es in der Delphi IDE ein Debug-Fenster, etwa so wie in in MS Visual Studio: Debug.WriteLine('Hello World');
... momentan lass ich das alles über ein Memo bzw. ShowMessage(...); ausgeben.


2. Ist es möglich, das mir die IDE so 'unspezifische' Fehler wie "unerlaubt Zugriffe", "Speicherverletzungen", ... mit der Zeile anzeigen in der sie passieren ?

^^ Wollte letzte Woche auf ein Element einer eines deklariertes Arrays zugreifen. Fehler war, dass das Array leer war.

Im 'Debug-Modus' (grüner Pfeil mit den roten Quadrat), wird ja nur der ASM-Code angezeigt ?!


Weniger IDE-related:

4. Wie finde ich heraus, zu welcher Funktion welches "Modul/Unit" (??) gehört:

ShellExecute >> ShellApi
Now >> DateUtils;

Machmal sagt schon die IDE, "unbezeichnete Methode" o.ä. ... dann drücke ich F1 und die Hilfe zeigt mir das Modul an. Heute morgen mit ShellExecute nicht ?!
^ Habe gerade das Hilfe Update installiert ggf. passt es dann.


5. Für Oracle DB-Anbindung benutze ich OraTools.



Delphi-Quellcode:
...
myQuery := TOraQuery.Create(nil);
myQuery.Session := OraSession1;

myQuery.SQL.Add('SELECT somekey FROM sometable WHERE ... ');
myQuery.Open;

for I := 0 to myQuery.RecordCount-1 do begin
  { Do something !}
  myQuery.Next;
end;

...
... wenn nun meine kompilierte Anwendung den Fokus verliert und/oder ein anderes Fenster darüberliegt - anschließend mein Delphi Anwendung wieder Fokus bekommt wird dieses nicht mehr gerendert. Brauche ich hier mehrere Threads (wie Linux/Gnome) ? >> GUI-Thread und Thread für meinen Code ?

Tips sind willkommen :-)


Grüße und besten Dank
Florian

dominikkv 24. Okt 2011 21:52

AW: Debugging in der IDE
 
1) http://delphi-treff.de/ueber-delphi/...gnisprotokoll/
4) Das mache ich auch immer durch "In die Hilfe/Google/DP schauen". Theoretisch sollte das über das Refactoring gehen...
5) Entweder mit Application.Processmessages die Warteschlange abarbeiten und damit das Neuzeichnen erlauben, oder eben wie du selbst gesagt hast Threads (sauberer)

himitsu 24. Okt 2011 22:08

AW: Debugging in der IDE
 
Welche Delphi-Version nutzt du denn? (sowar könnte man eventuell auch gleich in seinem Forenprofil erwähnen)
[edit] XE > hatte ich über sehn :oops:

4) Halte mal die Maus über das Gewünschte und warte ein Sekündchen.
Ansonsten wäre eben die OH der erste Ansprechpartner.
Sobald man die VCL-Quellcodes besitzt (ab den Professionals, wenn sie installiert wurden), kann man auch Strg+Linksklick auf das wort machen und landet dort, wo es deklariert wurde.

2) Bezüglich der Arrays > Projektoptionen, dort nach sowas "Indexprüfung" suchen und dieses aktivieren.

<code> = falsch (könntest'e ja noch schnell entsprechend editieren)
[code] = richtig (BB-Codes und kein HTML-Zeugs)
[delphi] = besser (der Button mit dem roten Helm)

Zitat:

... wenn nun meine kompilierte Anwendung den Fokus verliert und/oder ein anderes Fenster darüberliegt - anschließend mein Delphi Anwendung wieder Fokus bekommt wird dieses nicht mehr gerendert. Brauche ich hier mehrere Threads (wie Linux/Gnome) ? >> GUI-Thread und Thread für meinen Code ?
Nein, nur wenn du Mehreres gleichzeitig (innerhlab deiner Anwendung) machen willst, dann brauchst'e Thread.
Da hast du also einen Fehler in der Darstellung, dein Programm ist verreckt oder sonstwas.

Was wird denn nicht gerendert? (normale Kompoenten ala TEdit oder eventuell was selbsgemaltet)
Reagiert das Programm denn ansonsten? (abgersehn von der Darstellung)

foobar3000 24. Okt 2011 23:51

AW: Debugging in der IDE
 
vielen Dank für eure Antworten soweit.


Zu Punkt 5.

habe gerade mit einer in Delphi 7 kompilierten Version Screenshots gemacht :-(
... die Delphi XE Anwendungen unter Win XP sehen nicht besser aus und der Fokus kommt gar nicht mehr zurück bis die Anwendung beendet ist !

Hardware: Intel i5 (4 Kerne) - 4 GB Ram.

Screenshots siehe hier: https://picasaweb.google.com/1013019...eat=directlink
(Die ersten 4 Bilder (WinXP, Oracle VirtualBox auf Debian Squeeze) - die letzen 2 (Win 7, real)

Die Anwendung läuft eben schon weiter, bis sie sich eben durch alle Datensätze gequält hat.

Der Quelltext - gekürzt, nicht schön formatiert:

Delphi-Quellcode:

...

begin
  metaFlag: True;
  filePath := 'C:\xmlTest\';
  xmlDoc := TXMLDocument.Create(nil);
  xmlDoc.Active := True;

  myQuery.SQL.Clear;
  myQuery.SQL.Add('...');
  myQuery.Open;

  SetLength(row, myQuery.RecordCount);
  for R := 0 to myQuery.RecordCount-1 do begin
    row[R, 0] := myQuery.FieldByName('key_1').asString;
    row[R, 1] := myQuery.FieldByName('key_2').asString;
    row[R, 2] := myQuery.FieldByName('key_3').asString;
    row[R, 3] := myQuery.FieldByName('key_4').asString;
    myQuery.next;
  end;

  for J := 0 to high(row) do begin
   for S := 0 to high(saisons) do begin
    
       if AktSA <> row[0] then begin
         if AktSA <> '' then begin
      writeFlag = True;
         end;
         AktSA = row[0];
       end;
       fileName := filePath + row[3] + '_' + AktSA + '.xml';

       myQuery.SQL.Clear;
       myQuery.SQL.Add('...');
       myQuery.Open;

       Form1.Memo1.Lines.Add(sLineBreak);
       Form1.Memo1.Lines.Add(myQuery.SQL.Text);
       Form1.Memo1.Lines.Add(IntToStr(myQuery.RecordCount) + ' Ergebnisse');

       feingehalt := myQuery.FieldByName('somekey_1').AsString;
       bf_kuerzel := myQuery.FieldByName('somekey_2').AsString;
       ul_alphaCode := myQuery.FieldByName('somekey_3').AsString;

       myQuery.SQL.Clear;
       myQuery.SQL.Add('...');
       myQuery.Open;

       if metaFlag = True then begin
         root := xmlDoc.AddChild('ImportData');

         metaNode := root.AddChild('MetaData');
         metaNode.Attributes['foo'] := AktSA;
         { and some more }
    
       end;

       myQuery.SQL.Clear;
       myQuery.SQL.Add('...');
       myQuery.Open;

       SetLength(ad_exp_ekr_gd_groesse, myQuery.RecordCount);

       for I := 0 to myQuery.RecordCount-1 do begin
         { add to xmlDoc }

         myQuery.Next;
       end;

       {ItemPlanning}
       ItemPlanning := item.AddChild('somechild');

       myQuery.SQL.Clear;
       myQuery.SQL.Add('...');
       myQuery.Open;

       Form1.Memo1.Lines.Add(sLineBreak);
       Form1.Memo1.Lines.Add(myQuery.SQL.Text);
       Form1.Memo1.Lines.Add(IntToStr(myQuery.RecordCount) + ' Ergebnisse');

        SetLength(country_category, myQuery.RecordCount);
       for I := 0 to myQuery.RecordCount-1 do begin
         { add to xmlDoc }
         myQuery.next;
       end;

       myQuery.First;
       for C := 0 to high(country_category) do begin
         { add to xmlDoc }

         myQuery.SQL.Clear;
         myQuery.SQL.Add('...');
         myQuery.Open;

         Form1.Memo1.Lines.Add(sLineBreak);
         Form1.Memo1.Lines.Add(myQuery.SQL.Text);
         Form1.Memo1.Lines.Add(IntToStr(myQuery.RecordCount) + ' Ergebnisse');

         for I := 0 to myQuery.RecordCount-1 do begin
      { add to xmlDoc }
      myQuery.Next;
         end;
       end;

         myQuery.SQL.Clear;
         myQuery.SQL.Add('...');
         myQuery.Open;
         AktPr := '';
         AktGr := '';
         for I := 0 to myQuery.RecordCount-1 do begin
       { add to xmlDoc }
      myQuery.Next;
         end;

       {DoaAssignment}
       {ItemI18N}

       myQuery.SQL.Clear;
       myQuery.SQL.Add('...');
       myQuery.Open;

       for I := 0 to myQuery.RecordCount-1 do begin
         { add to xmlDoc }
         myQuery.Next;
       end;

       if writeFlag = True then begin
         s1 := TStringList.Create;
         s1.Assign(xmlDoc.XML);
         s1.Insert(0, '<?xml version="1.0" encoding="utf-8"?>');
         s1.SaveToFile(fileName);
         writeFlag = False;
         metaFlag = True;
       end;    
     end;
   end;
  end;
end.

Luckie 24. Okt 2011 23:57

AW: Debugging in der IDE
 
Als aller erstes: Du tust dir selber einen Gefallen, wenn du die Routine in mehrere aufteilst. Faustregel für mich ist immer: Eine Routine, eine Aufgabe.

Dass sich dein Fenster nicht mehr neu zeichnet ist doch logisch. Wann soll denn der Code zum Neuzeichnen ausgeführt werden, wenn der Prozess die ganze Zeit mit der Datenbank beschäftigt ist? Es wird also kein Weg um Threads herumführen, wenn man es sauber implementieren will.

Und bitte stelle pro Beitrag immer nur eine Frage. Es fängt jetzt schon an hier munter durcheinander zu gehen und der Beitragstitel hat auch nichts wirklich mit deinen Fragen zu tun. Was soll ich als Moderator jetzt machen?

himitsu 25. Okt 2011 00:24

AW: Debugging in der IDE
 
Ach so, du führst also eine "langandauernde" Aktion aus (klang irgendwie anders) und wenn wärenddessen die Form neu gezeichnet werden müsste, dann passiert das nicht (bis die Aktion fertig ist).

Wie Luckie schon sagte:
- Threads

- oder in angemessenen Abständen Delphi-Referenz durchsuchenApplication.ProcessMessages aufrufen, damit angefallende Messages (wozu auch das Neuzeichnen gehört) verarbeitet werden.
(z.B. alle 50 bis 500 Millisekunden, aber nicht zu oft, da es eventuell extrem ausbremsen könnte)



Bei weiteren Fragen zu diesem Punkt aber auf jeden Fall einen neuen thread aufmachen oder nachsehn, ob die Forensuche nicht sogar (ganz bestimmt sogar) etwas findet.


PS: Screenshots besser direkt an den Beitrag anhängen.

jaenicke 25. Okt 2011 07:56

AW: Debugging in der IDE
 
Zitat:

Zitat von foobar3000 (Beitrag 1132337)
2. Ist es möglich, das mir die IDE so 'unspezifische' Fehler wie "unerlaubt Zugriffe", "Speicherverletzungen", ... mit der Zeile anzeigen in der sie passieren ?

Was dein Array angeht ja, indem du in den Projektoptionen die Bereichsprüfung aktivierst. Dann werden die Zugriffe vorher geprüft (sollte natürlich nur zum Debuggen aktiv sein, d.h. nicht in der Releasekonfiguration).

Zitat:

Zitat von dominikkv (Beitrag 1132339)
4) Das mache ich auch immer durch "In die Hilfe/Google/DP schauen". Theoretisch sollte das über das Refactoring gehen...

Nur, wenn die Unit schon im Projekt enthalten ist. Sonst klappt das (zumindest bei mir) nicht.

Sherlock 25. Okt 2011 09:00

AW: Debugging in der IDE
 
Zitat:

Zitat von jaenicke (Beitrag 1132372)
Zitat:

Zitat von foobar3000 (Beitrag 1132337)
2. Ist es möglich, das mir die IDE so 'unspezifische' Fehler wie "unerlaubt Zugriffe", "Speicherverletzungen", ... mit der Zeile anzeigen in der sie passieren ?

Was dein Array angeht ja, indem du in den Projektoptionen die Bereichsprüfung aktivierst. Dann werden die Zugriffe vorher geprüft (sollte natürlich nur zum Debuggen aktiv sein, d.h. nicht in der Releasekonfiguration).

Och, wieso denn nicht? Bereichsfehler können doch auch im Release auftreten.

Sherlock

p80286 25. Okt 2011 09:09

AW: Debugging in der IDE
 
Zitat:

Zitat von Sherlock (Beitrag 1132382)
Och, wieso denn nicht? Bereichsfehler können doch auch im Release auftreten.

Weil, es gibt Programmierer, für die ist Testen und Debuggen das höchste Glück auf Erden.
Die anderen kennen die DP nicht.


Gruß
K-H

himitsu 25. Okt 2011 09:30

AW: Debugging in der IDE
 
Das Problem ist, daß zusätzliche Prüfungen den Code schon etwas ausbremsen können (wenn sie sehr oft vorkommen).


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:34 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz