ich habe zwei Anwendungen erst mal von Delphi5 nach Lazarus für Linux
portiert. Alles schaut gut aus. Dann hab ich sie von Lazarus für Linux nach
Lazarus für Windows portiert. Da treten dann seltsame Effekte auf:
Beide Anwendungen starten zusätzlich zum Windows Fenster ein
Konsolenfenster. Warum? Wie kriege ich das weg?
Die eine Anwendung schafft nicht, das Windows Fenster zu erzeugen. Am Ende
meines FormCreate() Codes kommt die Exception: Failed to create win32
control, error: 1407 : Fensterklasse wurde nicht gefunden. Wie krieg ich
diese Exception weg?
Gruß
Heiner
> ich habe zwei Anwendungen erst mal von Delphi5 nach Lazarus für Linux
> portiert. Alles schaut gut aus. Dann hab ich sie von Lazarus für Linux nach
> Lazarus für Windows portiert. Da treten dann seltsame Effekte auf:
>
> Beide Anwendungen starten zusätzlich zum Windows Fenster ein
> Konsolenfenster. Warum? Wie kriege ich das weg?
Schuld ist entweder die etwas unglücklich benannte Option in
Compiler Options - Win32 gui application (-WG)
oder ein {$APPTYPE CONSOLE} im Code.
Einen GUI+Konsole Zwitter gibt es nur unter Windows. Sonst reicht es
üblicherweise, das Programm aus einer Konsole zu starten, um dort drin
die Konsol-Ausgaben zu sehen.
> Die eine Anwendung schafft nicht, das Windows Fenster zu erzeugen. Am Ende
> meines FormCreate() Codes kommt die Exception: Failed to create win32
> control, error: 1407 : Fensterklasse wurde nicht gefunden. Wie krieg ich
> diese Exception weg?
Sieht nach einer fehlenden Drittanbieter-Komponente aus. Vielleicht
steht im Konsolfenster genaueres über die Klasse?
DoDi
Danke! Der Haken fehlte.
> oder ein {$APPTYPE CONSOLE} im Code.
Nee, das hätte ich gewusst.
> Einen GUI+Konsole Zwitter gibt es nur unter Windows. Sonst reicht es
> üblicherweise, das Programm aus einer Konsole zu starten, um dort drin die
> Konsol-Ausgaben zu sehen.
aber nur ohne Haken in Compiler Options - Win32 gui application (-WG)
> Sieht nach einer fehlenden Drittanbieter-Komponente aus.
Drittanbieter Komponenten hab ich in dem Programm keine drin außer Indy 10.
Und da verwende ich nicht die graphischen Komponenten, sondern instantiere
nur ein IdHTTP bei Bedarf. Ich verwende fast nur Standard Komponenten
und Dialoge.
> Vielleicht steht im Konsolfenster genaueres über die Klasse?
Failed to create win32 control, error: 1407 : Fensterklasse wurde nicht
gefunden
.
[FORMS.PP] ExceptionOccurred
Sender=Exception
Exception=Failed to create win32 control, error: 1407 : Fensterklasse
wurde ni
cht gefunden.
Stack trace:
$0059F77B FINISHCREATEWINDOW, line 267 of win32wscontrols.pp
$005A0BA3 TWIN32WSCUSTOMFORM__CREATEHANDLE, line 403 of win32wsforms.pp
$004C3031 TWINCONTROL__CREATEWND, line 7265 of ./include/wincontrol.inc
$004157C3 TSCROLLINGWINCONTROL__CREATEWND, line 34 of
./include/scrollingwin
control.inc
$0041AFEC TCUSTOMFORM__CREATEWND, line 2467 of ./include/customform.inc
$0041BCB9 TFORM__CREATEWND, line 2825 of ./include/customform.inc
$004C2B65 TWINCONTROL__CREATEHANDLE, line 7176 of
./include/wincontrol.inc
$004C3CBA TWINCONTROL__HANDLENEEDED, line 7613 of
./include/wincontrol.inc
$00421ABB TAPPLICATION__CREATEFORM, line 2102 of
./include/application.inc
$004030EB main, line 30 of calprint.lpr
TApplication.HandleException Failed to create win32 control, error: 1407 :
Fenst
erklasse wurde nicht gefunden.
Stack trace:
$0059F77B FINISHCREATEWINDOW, line 267 of win32wscontrols.pp
$005A0BA3 TWIN32WSCUSTOMFORM__CREATEHANDLE, line 403 of win32wsforms.pp
$004C3031 TWINCONTROL__CREATEWND, line 7265 of ./include/wincontrol.inc
$004157C3 TSCROLLINGWINCONTROL__CREATEWND, line 34 of
./include/scrollingwin
control.inc
$0041AFEC TCUSTOMFORM__CREATEWND, line 2467 of ./include/customform.inc
$0041BCB9 TFORM__CREATEWND, line 2825 of ./include/customform.inc
$004C2B65 TWINCONTROL__CREATEHANDLE, line 7176 of
./include/wincontrol.inc
$004C3CBA TWINCONTROL__HANDLENEEDED, line 7613 of
./include/wincontrol.inc
$00421ABB TAPPLICATION__CREATEFORM, line 2102 of
./include/application.inc
$004030EB main, line 30 of calprint.lpr
exception at 0059F77B:
Failed to create win32 control, error: 1407 : Fensterklasse wurde nicht
gefunden
.
Bei der Zuweisung
Window := CreateWindowExW(FlagsEx,
PWideChar(WideString(pClassName)),
PWideChar(UTF8ToUTF16(WindowTitle)), Flags,
Left, Top, Width, Height, Parent, MenuHandle, HInstance,
@NCCreateParams)
wird Window 0. Aber leider lassen sich die Übergabeparameter von
CreateWindowExW() nicht anzeigen. Ich hab die Optimierungsstufe schon auf 0
gesetzt und Lazarus neu compiliert. Jetzt bin ich immer noch ratlos.
> DoDi
win32wscontrols.o und win32wscontrols.ppu werden leider gar nicht neu
erzeugt, wenn ich Lazarus neu compiliere.
> win32wscontrols.o und win32wscontrols.ppu werden leider gar nicht neu
> erzeugt, wenn ich Lazarus neu compiliere.
Wenn das RTL-Units sind, muß nach Änderungen darin die RTL neu übersetzt
werden. Öffne dazu eine Konsole, gehe ins FPC Quelltext-Verzeichnis RTL,
und starte dort "make" oder "make all". Siehe dortiges README.txt (engl.)
Du kannst auch in den IRC Chat FreeNode #lazarus-ide gehen, dort sind
fast rund um die Uhr Leute zugange, die Dir weiterhelfen können.
Englisch ist dabei hilfreich, aber wenn gerade nicht viel los ist,
kannst Du auch auf Deutsch fragen und hoffen, daß Dich jemand versteht.
Ansonsten sind Fragen zu Lazarus in der Lazarus Mailing-Liste besser
aufgehoben als in einem Delphi Forum.
DoDi
> Bei der Zuweisung
> Window := CreateWindowExW(FlagsEx,
> PWideChar(WideString(pClassName)),
> PWideChar(UTF8ToUTF16(WindowTitle)), Flags,
> Left, Top, Width, Height, Parent, MenuHandle, HInstance,
> @NCCreateParams)
> wird Window 0. Aber leider lassen sich die Übergabeparameter von
> CreateWindowExW() nicht anzeigen.
Die Anzeige von lokalen Variablen ist oft lückenhaft, muß z.B. bei
Pointern erst noch richtig formatiert werden. Darüber habe ich mich auch
schon desöfteren geärgert. (s.u.)
> Ich hab die Optimierungsstufe schon auf 0
> gesetzt und Lazarus neu compiliert.
Lazarus muß zum Debuggen nicht neu kompiliert werden, dafür reicht es,
ggf. die LCL neu zu compilieren (s.u.)
> Jetzt bin ich immer noch ratlos.
Dann setze eine Breakpoint auf CreateWindowEx, und schaue den Namen an.
Oder schreibe einfach mit DebugLn den Klassennamen in die Konsole, dann
mußt Du beim Crash/AV nur nachschauen, welches der zuletzt benutzte Name
war. Oder Du prüfst direkt nach diesem Aufruf auf Window=0, und gibst
nur im Fehlerfall eine Fehlermeldung mit dem Namen aus. Dann kannst Du
auf diesen Zweig auch einen Breakpoint setzen, und Dir den Call-Stack
mit allen Parametern anschauen. Wichtig ist jedenfalls, daß Du den
Ablauf anhalten kannst, *bevor* eine Exception geworfen wird - danach
ist der Call-Stack abgeräumt, und lokale Variablen sind nicht mehr
zugreifbar. Dann hilft nur noch das weiter, was bereits in der Konsole
steht.
Nicht vergessen, den Debug-Code nachher wieder zu löschen oder
auszukommentieren.
In der neuesten Lazarus-Version (0.9.31) wird die LCL automatisch neu
übersetzt, wenn Du Änderungen einbaust. In den älteren Versionen mußt Du
Tools|Configure "Build Lazarus..." aufrufen, und nur die LCL explizit
neu compilieren, damit Deine Änderungen wirksam werden. Dabei ggf.
"Debug" ankreuzen, um Debug-Ausgaben usw. in der LCL einzuschalten.
In Delphi war es bislang nicht möglich, die VCL so einfach neu zu
übersetzen. Hat sich daran was geändert?
DoDi
Hallo,
Sie kennen sich ja richtig gut aus! Danke für die vielen Tips!
Ich habe noch nie in die VCL rein schauen können, da ich in Sachen Delphi
nur Home User bin und mir immer nur das Billigste gekauft habe. Keine
Ahnung, wie das in den Enterprise Versionen aussah / aussieht.
Gruß aus Fürth
Heiner
Ich hab jetzt die wichtigsten Variablen
FlagsEx 65536
pClassName Window
WindowTitle Kalender
Flag 113901568
Left 589
Top 222
Width 583
Height 394
Parent 0
MenuHandle 0
HInstance 4194304
Daran schaut auf den ersten Blick noch nichts schlimm aus.
> Ich hab jetzt die wichtigsten Variablen
> FlagsEx 65536
> pClassName Window
> WindowTitle Kalender
> Flag 113901568
> Left 589
> Top 222
> Width 583
> Height 394
> Parent 0
> MenuHandle 0
> HInstance 4194304
> Daran schaut auf den ersten Blick noch nichts schlimm aus.
Eigentlich nicht. Eventuell noch Anführungszeichen um den Klassennamen
schreiben, damit unsichtbare Anhängsel (Leerzeichen...) sichtbar werden.
Zudem hätte ich eigentlich WINDOW erwartet, das WinAPI ist case-sensitiv.
Wie sieht das denn bei einem funktionierenden Programm aus?
DoDi
> Bei der Zuweisung
> Window := CreateWindowExW(FlagsEx,
> PWideChar(WideString(pClassName)),
> PWideChar(UTF8ToUTF16(WindowTitle)), Flags,
> Left, Top, Width, Height, Parent, MenuHandle, HInstance,
> @NCCreateParams)
> wird Window 0. Aber leider lassen sich die Übergabeparameter von
> CreateWindowExW() nicht anzeigen. Ich hab die Optimierungsstufe schon auf
> 0
> gesetzt und Lazarus neu compiliert. Jetzt bin ich immer noch ratlos.
gelöst!
Es fehlte Application.Initialize im *.lpr.
> Wie sieht das denn bei einem funktionierenden Programm aus?
Ich hab nicht mehr geschafft, das zu debuggen. Nachdem ich wieder Debug
gesetzt und die LCL neu compiliert hatte, kam beim Start von Lazarus eine
endlose Folge von Messageboxen. Ich hab das abgebrochen und Lazarus neu
installiert.
win32wscontrols gehört zur LCL
> Du kannst auch in den IRC Chat FreeNode #lazarus-ide gehen, dort sind fast
> rund um die Uhr Leute zugange, die Dir weiterhelfen können. Englisch ist
> dabei hilfreich, aber wenn gerade nicht viel los ist, kannst Du auch auf
> Deutsch fragen und hoffen, daß Dich jemand versteht.
Ich werde bei Bedarf mal dort rein schnuppern.
> Ansonsten sind Fragen zu Lazarus in der Lazarus Mailing-Liste besser
> aufgehoben als in einem Delphi Forum.
Ich hab mir mal ein paar Mails schicken lassen. Aber das sagt mir nicht so
zu.
Bei Lazarus Themen suche ich zuerst immer in der news:// Gruppe
de.comp.lang.pascal Hilfe. Aber diesmal wollte einfach nix zurück kommen.
de.comp.lang.delphi.misc ist viel häufiger frequentiert und ich hab gesehen,
dass dort auch Andere [Lazarus] Fragen stellen.
>> Wie sieht das denn bei einem funktionierenden Programm aus?
>
> Ich hab nicht mehr geschafft, das zu debuggen. Nachdem ich wieder Debug
> gesetzt und die LCL neu compiliert hatte, kam beim Start von Lazarus
> eine endlose Folge von Messageboxen. Ich hab das abgebrochen und Lazarus
> neu installiert.
Ich hatte Dich gewarnt: die IDE nicht grundlos neu bauen :-]
DoDi
Ansonsten gibt es auch noch das sehr aktive, deutsche Lazarusforum.
http://www.lazarusforum.de
Leider keine Newsgroup, aber zumindest ist dort recht viel los.
mfg
Micha
--
Meine Wanderungen durch Realität und Cyberspace
auf --> http://www.michael-fuchs.net <--