Autor Beitrag
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mo 30.12.02 21:22 
Hallo.

Ich habe heute von Luckie einen Rüffel bekommen, was ich denn mit dem Portscanner gemacht hätte. Listview und IP-Control wären nicht zu sehen. Nun muss ich dazu sagen, dass ich an diesem Problem tatsächlich unschuldig bin.

Mein Quellcode sieht nämlich so aus:
ausblenden Quelltext
1:
2:
3:
4:
// Bug in Delphi 5; "InitCommonControlsEx" funktioniert nicht korrekt.
// Der Work-Around lädt daher erst "InitCommonControls"
{$IFDEF VER130} InitCommonControls; {$ENDIF}
InitCommonControlsEx(icc);

Das Problem an sich war mir nämlich bekannt, und auf meine diesbezügliche Frage im Entwickler-Forum wies mich Nico auf den Fehler in Borlands "CommCtrl.pas" hin. Der Compilerschalter in obigem Codeausriss sorgt nun dafür, dass
ausblenden Quelltext
1:
InitCommonControls;					

als Work-Around nur bei Delphi 5 verwendet wird, da ich den Fehler hier aus eigener Erfahrung kenne. Bisher bin ich davon ausgegangen, dass neuere Versionen (D6, 7) dieses Problem nicht mehr haben. Aber Luckie benutzt Delphi 6, und er musste den Work-Around auch freischalten, damit die beiden genannten Elemente zu sehen sind.

Lange Rede, kurzer Sinn: da wir hier im Forum ja ein breites Spektrum an Delphi-Versionen haben, würde ich jeden Interessenten mal an dieses Posting verweisen: PORTSCANNER_II / IP-Adressenanzeige
Wer nicht lesen will, für den habe ich hier auf die Schnelle den Downloadlink des Portscanner-Quellcodes. Es wäre schön, wenn sich mal Besitzer von Delphi 2, 3, 4, 6 und 7 melden und mir sagen, ob sie das Problem auch haben. Im Normalfall dürften also nach dem Kompilieren und Starten des Programms die Listview und das IP-Control nicht zu sehen sein, da der o.g. Compilerschalter nur bei Delphi 5 wirksam wird.
Wenn ihr das Problem habt, dann bitte einfach mal die beiden Anweisung
ausblenden Quelltext
1:
2:
{$IFDEF VER130}
{$ENDIF}

entfernen, aber das "InitCommonControls" dazwischen stehen lassen! Wenn ihr es jetzt kompiliert, dann sollten Listview und IP-Control sichtbar sein. Und in dem Fall bitte ich um eine Meldung wie
Zitat:
Hi Mathias.
Ich habe Delphi ?, und das Problem tritt auf!


Mir geht es hauptsächlich um eine Ergänzung in Luckies Tutorials. Wenn neben Delphi 5 noch andere Versionen betroffen sind, dann ist ein Hinweis IMHO unbedingt erforderlich, damit die Leute nicht enttäuscht sind, weil die Programme scheinbar nicht funktionieren.

Danke, und Gruß,
Mathias.


PS: Das ist ein Cross-Posting in Delphi-PRAXiS und AUQ.de.
bis11
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1247
Erhaltene Danke: 2

Apple Mac OSX 10.11

BeitragVerfasst: Do 02.01.03 19:51 
Hi,

also ich habe Delphi 6 Enterprise und habe das beschriebene Problem. Und welches Tutorial von Luckies Seite ist gemeint ? Ich verstehe im Moment noch nicht ganz den Sinn darin.
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Do 02.01.03 22:29 
Tritt der Fehler auch mit installiertem SP und/oder anderen Updates auf?
Oder hast du eine D6-Version ohne irgendwelche Updates?


Der Sinn ist folgender: Um die sog. "Common Controls" (Listview, Toolbar, Tooltipps, Treeview, usw.) nutzen zu können, muss man diese mit dem Befehl
ausblenden Quelltext
1:
InitCommonControls;					

initialisieren. Bei der VCL passiert das meist irgendwie und irgendwo im Hintergrund, so dass das Problem nicht bzw. kaum auftritt. Arbeitet man mit der API, dann muss man sich darum selbst kümmern.

So, nun reicht einerseits beim IP-Control der o.g. Befehl nicht mehr aus, andererseits ist er von Microsoft im PSDK als obsolete (veraltet) bezeichnet worden. Normalerweise müssen also Anwendungen den Befehl
ausblenden Quelltext
1:
InitCommonControlsEx					

benutzen. Die Einzelheiten zum Befehl spare ich mir einfach mal. Dafür lege ich den Interessenten Luckies Tutorials ans Herz. Zu sagen ist dazu einfach: wer Programme schreibt, die nur aus einer Form bestehen und keine extra-ordinären Komponenten verwenden, der kommt mit der API meist besser weg und kann sein Programm (ohne irgendwelche Laufzeitbibliotheken, @Hinterwäldler) meist auf ein Zehntel der VCL-Größe schrumpfen. Aber der Nachteil ist eben, dass man sich um alles selbst kümmern muss, was einem die VCL sonst abnimmt.

Wie gesagt: bei Interesse, Luckies Tutorials ansehen! :wink:


Borland hat in der Unit "CommCtrl.pas" nun eine eigene Funktion mit diesem Namen deklariert. Das liegt daran, dass "InitCommonControlsEx" unter Win 95 und NT4 nur mit IE3 (und höher) zur Verfügung steht.
Und als Programmierer weißt du ja, was passiert, wenn du eine nicht vorhandene DLL-Funktion statisch laden willst. :)

Aus dem Grund wird versucht, die Funktion dynamisch zu laden. Aus der DLL wohlgemerkt! Problem: Borland hat´s bei Delphi 5 so formuliert:
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
if ComCtl32DLL = 0 then
  begin
    ComCtl32DLL := GetModuleHandle(cctrl);
    if ComCtl32DLL <> 0 then
      @_InitCommonControlsEx := GetProcAddress(ComCtl32DLL, 'InitCommonControlsEx');
  end;

Wenn also "ComCtl32DLL" Null ist, wird versucht, dass DLL-Handle zu finden:
ausblenden Quelltext
1:
ComCtl32DLL := GetModuleHandle(cctrl);					

Tja, wenn die DLL aber nicht geladen ist, passiert nichts, weil Borland IMHO nicht an diese Möglichkeit gedacht hat. Du kannst den Bug selbst ausmerzen, indem du nach der eben genannten Zeile folgendes einfügst:
ausblenden Quelltext
1:
if ComCtl32DLL = 0 then ComCtl32DLL := LoadLibrary(cctrl);					

Nur: damit können Besitzer der Standard- oder Personal-Editionen nichts anfangen, weil sie die Sourcen nicht besitzen. Für sie gilt der Work-Around, "InitCommonControls" vorher aufzurufen.

Ja, und mich interessiert nun ganz einfach, welche Delphi-Versionen noch davon betroffen sind. Ich bin bisher davon ausgegangen, dass nur D5 und bestenfalls die alten Versionen vor 5 dieses Problem haben. Dass D6 aber auch damit zu kämpfen hat (zumal Borland den Bug angeblich kennen soll), hat mich schon gewundert. Sieh´s als persönliche Frage an. Ich bin eben neugierig. :)

Ein spezielles Tutorial habe ich übrigens nicht gemeint. Ich würde einfach nur die Hilfedatei "CommonC.chm" mit einem entsprechenden Hinweis ergänzen wollen, da dieser Bug nun doch verbreiteter zu sein scheint, als ich erst angenommen habe.
bis11
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1247
Erhaltene Danke: 2

Apple Mac OSX 10.11

BeitragVerfasst: Do 02.01.03 23:22 
hi,

Zitat:

Tritt der Fehler auch mit installiertem SP und/oder anderen Updates auf?
Oder hast du eine D6-Version ohne irgendwelche Updates?


Nee, ich habe überhaupt keine SP's zu Delphi 6 installiert. Wenn ich die installiere, bekomme ich immer komische Fehlermeldungen und Delphi 6 funktioniert nicht mehr.
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Sa 11.01.03 20:53 
Um mal das alte Thema aufzuwärmen:

Ich habe heute eine Mail bekommen. Ja, gut, das passiert schon mal ... :wink: ... aber da stand drin, dass der Fehler auch unter Delphi 7 auftritt. Ich weiß allerdings nicht ob mit oder ohne Updates/Servicepacks.
Im speziellen bezog sich das auf D7 Enterprise unter WinXP, aber ´s dürften wohl alle D7-Versionen betroffen sein.

Stehen noch Infos aus zu D2, D3 und D4.
Wer hat die?