Autor Beitrag
Frankieboy
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 65



BeitragVerfasst: Sa 12.04.08 22:21 
Hi,

ich werd noch verrückt. :evil: :evil:
Endlich ist mein Programm fertig, fast alle Bugs beseitigt und jetzt das...

Ein ganz einfaches Form (FormUnlock) macht mir Probleme - für nähere Infos: Anhang Fehler1.jpg

Jedesmal, wenn es im Code mit
FormUnlock.Show oder FormUnlock.ShowModal
aufgerufen wird, wird es nur verstümmelt angezeigt! Das Mask-Edit und andere Komponenten fehlen während der Laufzeit einfach/werden nicht angezeigt (siehe Anhang Fehler2.jpg).
Da es sich aber um einen wichtigen Teil des Programms handelt, kann ich nicht weitermachen...

Sobald dann das Programm per
ausblenden Delphi-Quelltext
1:
Application.Terminate					

geschlossen wird, kommt noch eine Fehlermeldung hinterher: "Ungültiges Fensterhandle" (siehe Anhang Fehler3.jpg)

Hat jemand eine Ahnung was ich machen soll? Es ist schon klar, dass das realtiv wenige Informationen zum "Fern-Debuggen" sind, aber ich will das Programm so schnell wie möglich fertig stellen!!


Vielen Dank schon mal,

Frankie
Einloggen, um Attachments anzusehen!
Bernhard Geyer
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 721
Erhaltene Danke: 3



BeitragVerfasst: Sa 12.04.08 22:25 
Versuchst du das Formular in einem Thread anzuzeigen/aufzurufen?

Fals ja: Lies mal den Kommentar durch den Delphi bei Anlegen einer Unit mit einem Nachfahren von TThread in der Unitdatei ergänzt.
Frankieboy Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 65



BeitragVerfasst: Sa 12.04.08 23:59 
Das Programm hat normalerweise nur einen Thread, den Standardthread.
Allerdings benutze ich auf einem Formular ('Process', im Anhang 2 zu sehen) die VC TDosCommand. Damit führe ich das Befehlszeilenprogramm openssl.exe aus.

Direkt nach dessen Beendung wird auch das Formular Unlock aufgerufen.

TDosCommand bildet zur Ausführung des Programms zwar einen eigenen Thread (TThread), das weiß ich aus der Unit der VC. Allerdings ist dieser schon wieder geschlossen, wenn das FormUnlock angezeigt wird.

Außerdem habe ich ähnliche Probleme mit Anzeigen von FormUnlock, wenn ich es einfach vom Hauptformular meines Projektes aufrufe - zb. mit Onclick-Event - zu diesem Zeitpunkt wurde TDosCommand noch gar nicht benutzt, und das Hauptformular enthält ja auch kein TDosCommand-Objekt...

Ich forste nochmal den Sourcecode der Komponente durch.

Trotzdem schon mal vielen Dank!


--- EDIT ---
An der Komponente DosCommand und ihrem eigenen Thread kann es nicht liegen. Ich habe sie zum Test einmal komplett aus meinem Programm entfernt... Also bleibt da nur noch der Main-Thread.

Durch Zufall (Einfügen eines Breaks) bin ich auf noch mehr Probleme gestoßen:
So macht schon das aufrufen des Create Konstruktors einer TRegistry-Variable Probleme, die ich zum lesen der Optionen in der Win-Registry benutze:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
procedure TFormOptions.LoadOptions;
var Reg: TRegistry
  Buffer: TStrings;

begin
  Reg := TRegistry.Create;  { Exception: 'access violation at 0x004c94a5, other at 0x004c94a5' }
  {...}
  Buffer := TStringList.Create; {auch Access Violation }
end;


Jetzt weiß ich nicht mehr so genau, was ich noch machen soll :roll: :?:
Fabian E.
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 554

Windows 7 Ultimate
Visual Studio 2008 Pro, Visual Studion 2010 Ultimate
BeitragVerfasst: So 13.04.08 18:52 
welches OS hast du denn? Vielleicht springt dir vista dazwischen beim erstellen der Reg-Variable oder so. Ist mir zwar noch nie passiert aber du kannst ja mal versuchen, das program mit admin rechten zustarten falls du vista hast.

Ansonsten hast du vielleicht irgendwelche Registry schutzprogramme installiert die dazwischenfunken können?

gruß
Frankieboy Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 65



BeitragVerfasst: So 13.04.08 23:34 
OS (seit 2 Jahren und wird so bleiben): WinXP x86

Also, ich hab jetzt mal meine Comodo Firewall runtergeschmissen.
Sonst ist nur ein Virenscanner -AntiVir- installiert, den hab ich schon lange und sollte kein Problem sein. Andere On-Access-Scanner oder Sicherheitstools irgend einer Art laufen nicht.

Entweder
1. Hab ich n Virus
2. Stimmt was mit Windows nicht oder
3. stimmt was mit Delphi nicht

Lustigerweise hab ich das Problem mit TRegistry dazu in jedem beliebigen Formular, auch komplett neu erzeugte mit New|Project.

Ich werd das ganze jetzt erst mal auf Eis legen, vielleicht fällt mir ja noch was ein.


Grüße und trotzdem Danke,

Frankie
Timbo
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 166



BeitragVerfasst: Mo 14.04.08 00:19 
Hi,

also für mich klingt das nach einem ganz andern Problem, hast Du dynamische Arrays im Programm oder sonstige Geschichte mit manueller Speicherreservierung?
Ich denke das Problem liegt ganz wo anders und es tritt nun zufällig an der Stelle auf.
Hast Du Warungen vom Compiler?
Geh die brisanten Stellen nochmal durch, ist bestimmt irgendwo noch ein Fehler versteckt.

Kennst Du FastMM4 vieleicht hilft Dir das ja weiter...
Frankieboy Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 65



BeitragVerfasst: Mo 14.04.08 14:45 
Zu der manuellen Speicherreservierung:
Nein, ich benutze keine dynamischen Array, etc...
Wie gesagt, nur DosCommand und da bin ich mir nicht ganz sicher, ob es bugfrei ist.

Außerdem:
Ich hab mit mit File|New|Application zum Testen eine komplett neue Applikation angelegt. Dann in der Unit von Form1 eine globale Variable Reg: TRegistry erstellt und die Unit Registry zu den Interface Units hinzugefügt.
Dann habe ich einen simplen Button eingefügt.

OnClick_Event des Buttons:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
procedure TForm1.Button1Click(Sender: TObject);
begin
  Reg := TRegistry.Create;
end;


Nach starten des Programms und Anklicken des Buttons passiert nichts: keine Fehlermeldung.
Nun füge ich aber im Editor einen Codebreak bei Reg := TRegistry.Create; ein. Nach dem das Programm gestartet ist, hält der Compiler nach Drücken des Knopfs Button1 an.
Klicke ich jetzt Trace Into kommt eine Access Violation.

Die Probleme treten also bei einfachsten Programmen auf - das kann nicht an einem Codefehler liegen! Da stimmt was anderes nicht.

Zum Compiler:
nein, der Compiler warnt/meckert nicht. Ich kriege nur die Exceptions.
Einloggen, um Attachments anzusehen!