Refreshen einer TDriveComboBox

moin,

ich hab da mal ein kleines problem:

wie kann ich meiner DriveComboBox sagen, dass sie refreshet werden soll??? ich meine, wenn man z.b. eine neue cd einlegt, dass dann auch gleich der neue name angezeigt wird…

mit refresh und repaint zeichnet er ja anscheinend nur die komponente neu, die volumenamen sind aber die selben

thnx,

burn

Hi burn,

wie kann ich meiner DriveComboBox sagen, dass sie refreshet
werden soll??? ich meine, wenn man z.b. eine neue cd einlegt,
dass dann auch gleich der neue name angezeigt wird…

mit refresh und repaint zeichnet er ja anscheinend nur die
komponente neu, die volumenamen sind aber die selben

nein, mit refresh und repaint kommst Du nicht weiter. Es ist in der Tat (leider) so, daß die TDriveComboBox-Komponente die entsprechende Windows-Message beim Device-Wechsel nicht auswertet (dies wäre die sauberste Lösung für die Automatische-Update-Fähigkeit). Ich hab mal gerade in den Quellcode geguckt, und festgestellt, daß ihr Inhalt aber bei einer Änderung des Properties „TextCase“ geupdatet wird (was es nicht alles gibt… :wink: ).

Wenn man nun noch weiß, daß Windows bei jedem Device-Wechsel an alle Anwendungen die Nachricht WM_DEVICECHANGE sendet (näheres siehe Windows-SDK-Online-Hilfe), liegt diese – zugegebenermaßen nicht sehr ästhetische, aber ihren Zweck erfüllende – Lösung nahe:

PROCEDURE TForm1.WMDeviceChange;

PROCEDURE RebuildDCB (DCB\_: TDriveComboBox);

CONST
 OTHERTC:
 ARRAY[TTextCase] OF TTextCase
 = (tcUpperCase, tcLowerCase);

begin
 DCB\_.TextCase := OTHERTC[DCB\_.TextCase];
 DCB\_.TextCase := OTHERTC[DCB\_.TextCase]
end;

begin
 // Hier "RebuildDCB" für alle DriveComboBoxen aufrufen
 RebuildDCB(DriveComboBox1);
 // RebuildDCB(DriveComboBox2);
 // RebuildDCB(DriveComboBox3)
 // etc.
end;

mit dem (in die PRIVATE-Section der TForm1-Deklaration gehörenden) Prototyp

PROCEDURE WMDeviceChange(VAR Message: TMessage); message WM\_DEVICECHANGE;

Ich hoffe, ich konnte Dir helfen.

Mit freundlichem Gruß
Martin

wow!

thnx a lot

burn

hi,

ich hab da doch noch ein kleines problem:
keine ahnung, ob das an meinem delphi4 liegt oder woran auch immer, aber bei der deklaration der konstanten kriege ich die fehlermeldung : „die anzahl der elemente ist von der deklaration unterschiedlich“

PROCEDURE RebuildDCB (DCB_: TDriveComboBox);

CONST
OTHERTC:
ARRAY[TTextCase] OF TTextCase
= (tcUpperCase, tcLowerCase);

hat einer ne ahnung, woran das liegt. ich sehs nicht wirklich =)

burn

aber bei der deklaration der konstanten kriege ich die
fehlermeldung : „die anzahl der elemente ist von der
deklaration unterschiedlich“

Hast Du überprüft, ob diese Fehlermeldung als einzige auftritt (oder nur eine von mehreren ist, aber gerade zufällig als oberste im Fehlermeldungsfenster sichtbar ist)? Gibt es in Deinem Programm zufällig eine weitere Definition eines gleichnamigen Typs „TextCase“? Hast Du den Typ „TextCase“ anhand der Delphi-Online-Hilfe überprüft (ich hab Delphi 5, vielleicht hat sich diesbezüglich ja was geändert)?

Wenn’s nix hilft, oder Du auf die Fehlersuche keine Lust hast, denkst Du Dir halt ne Ersatzkonstruktion aus, die kein Array benötigt, dafür aber etwas „uneleganter“ aussieht, etwa:

PROCEDURE RebuildDCB (DCB\_: TDriveComboBox);
begin
 IF (DC\_.TextCase=tcUpperCase) THEN
 begin
 DC\_.TextCase=tcLowerCase;
 DC\_.TextCase=tcUpperCase 
 end 
 ELSE
 begin
 DC\_.TextCase=tcUpperCase;
 DC\_.TextCase=tcLowerCase
 end
end;

Das sollte jetzt aber funktionieren :wink:.

Mit freundlichem Gruß
Martin

ich rall das nicht =))

komisch, ich will dich ja nicht unnötig strapazieren martin, aber jetzt bekomme ich die fehlermeldung „Inkompatible Typen FileCtrl.TTextCase und DirOutln.TTextCase“

das versteh ein anderer…

burn

Hi burn,

komisch, ich will dich ja nicht unnötig strapazieren martin,

ne, da mach Dir mal keine Gedanken drüber :smile:. Wenn ich keine Lust hätte, hier jemandem zu helfen, dann würde ich es einfach von vornherein bleiben lassen, wa?

aber jetzt bekomme ich die fehlermeldung „Inkompatible Typen
FileCtrl.TTextCase und DirOutln.TTextCase“

Aha. Aaaaalso: In Deinem Projekt sind sowohl die Unit „FileCtrl“ (darin ist unter anderem die TDriveComboBox-Klasse implementiert) als auch die Unit „DirOutln“ eingebunden. Und jetzt kommt’s: Beide Units enthalten an irgendeiner Stelle die Definition eines Typs mit demselben Namen „TTextCase“. In der Unit „FileCtrls“ sieht er so aus:

TTextCase = (tcLowerCase, tcUpperCase),

aber in der Unit „DirOutln“ ist der Typ „TextCase“ anders definiert (keine Ahnung, wie; ich ich kenne diese Unit nicht).

Wenn Du nun in Deinem Code einfach „TTextCase“ hinschreibst, dann wird’s für den Compiler zweideutig. Zu diesem Zeitpunkt erscheint aber noch keine Fehlermeldung, sondern der Compiler sucht sich einfach eine der Units aus und sagt: „So, dieses „TTextCase“ ist für mich jetzt einfach dasjenige aus dieser Unit!“ (Frag mich bitte nicht, nach welchem Kriterium er seine Wahl trifft – ich habe keine Ahnung). Wenn er nun aber die „falsche“ Unit erwischt hat, dann kommt die Fehlermeldung „Inkompatible Typen“. Im Fachjargon spricht man in so einem Fall übrigens davon, daß sich „Scopes überschneiden“ („Scope“ = „Gültigkeitsbereich“, hier solche von Typdefinitionen).

Die Lösung ist extrem simpel. Alles was Du tun mußt, ist, den entsprechenden Typen den Namen der „Bezugs-Unit“ mit einem Trenn-Punkt voranzustellen. Damit „zwingst“ Du den Compiler, die entsprechende Unit zu referenzieren.

Also: Da Du dem Compiler die Unit „FileCtrl“ aufzwingen mußt, erweiterst Du „TTextCase“ zu „FileCtrl.TTextCase“,
„tcUpperCase“ zu „FileCtrl.tcUpperCase“ sowie „tcLowerCase“ zu
„FileCtrl.tcLowerCase“.

Mit freundlichem Gruß
Martin

neeeeeeeeeee, ich glaubs ja nicht !!! DAS GEHT =)))))

du weißt ja nicht, wie du mir damit geholfen hast! wenn du mal fragen hast, meld dich. weiß zwar eher was über flash und webdesign , aber melde dich, wenn du was wissen willst =)

many thnx

burn
([email protected])