AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Debugging in der IDE

Ein Thema von foobar3000 · begonnen am 24. Okt 2011 · letzter Beitrag vom 25. Okt 2011
Antwort Antwort
Seite 1 von 2  1 2      
foobar3000

Registriert seit: 24. Okt 2011
3 Beiträge
 
#1

Debugging in der IDE

  Alt 24. Okt 2011, 22:41
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

Geändert von mkinzler (25. Okt 2011 um 06:36 Uhr) Grund: Codetag korrigiert und durch Delphi-Tag ersetzt
  Mit Zitat antworten Zitat
dominikkv

Registriert seit: 30. Sep 2006
Ort: Gundelfingen
1.109 Beiträge
 
Delphi 2007 Professional
 
#2

AW: Debugging in der IDE

  Alt 24. Okt 2011, 22:52
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)
Dominik
Wer anderen eine Grube gräbt, hat ein Gruben-Grab-Gerät!

Geändert von dominikkv (24. Okt 2011 um 22:54 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.078 Beiträge
 
Delphi 12 Athens
 
#3

AW: Debugging in der IDE

  Alt 24. Okt 2011, 23:08
Welche Delphi-Version nutzt du denn? (sowar könnte man eventuell auch gleich in seinem Forenprofil erwähnen)
[edit] XE > hatte ich über sehn

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)
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu (25. Okt 2011 um 01:16 Uhr)
  Mit Zitat antworten Zitat
foobar3000

Registriert seit: 24. Okt 2011
3 Beiträge
 
#4

AW: Debugging in der IDE

  Alt 25. Okt 2011, 00:51
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.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#5

AW: Debugging in der IDE

  Alt 25. Okt 2011, 00:57
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?
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.078 Beiträge
 
Delphi 12 Athens
 
#6

AW: Debugging in der IDE

  Alt 25. Okt 2011, 01:24
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.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu (25. Okt 2011 um 01:27 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.589 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: Debugging in der IDE

  Alt 25. Okt 2011, 08:56
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).

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.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
Benutzerbild von Sherlock
Sherlock

Registriert seit: 10. Jan 2006
Ort: Offenbach
3.798 Beiträge
 
Delphi 12 Athens
 
#8

AW: Debugging in der IDE

  Alt 25. Okt 2011, 10:00
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
Oliver
Geändert von Sherlock (Morgen um 16:78 Uhr) Grund: Weil ich es kann
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#9

AW: Debugging in der IDE

  Alt 25. Okt 2011, 10:09
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
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.078 Beiträge
 
Delphi 12 Athens
 
#10

AW: Debugging in der IDE

  Alt 25. Okt 2011, 10:30
Das Problem ist, daß zusätzliche Prüfungen den Code schon etwas ausbremsen können (wenn sie sehr oft vorkommen).
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:52 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz