![]() |
AW: Komponente umstellen
Zitat:
Habe noch ein anderes kleines Problem. Zur zeit setze ich die Device auf diese weise per Hand.
Delphi-Quellcode:
Das ist mir aber nicht aussagekräftig genug.
AudioVolume2.SelectAudioDevice(1);
Jetzt versuche ich die Device als Property zu addieren. So kann man sehen welche gerade aktiv sind. Allerdings hab ich da noch einen Fehler, es werden die TStrings addiert aber in einer Liste. Ich möchte die Einträge jedoch direkt wählen als Liste im AudioDevice property. Siehe Shot. gruss |
AW: Komponente umstellen
Wenn Du da im Objektinspektor was auswählen willst, nimm doch dafür 'nen Aufzählungstypen.
Sowas z. B.?
Delphi-Quellcode:
An die Nummer für
TAudioDevices = set of (adLautsprecher, adStereoMix, acLineIn, acCDAudio);
... FAudioDevices: TAudioDevices; ... property AudioDevices: TAudioDevices read FAudioDevices write FAudioDevices; // oder halt 'nen Setter bauen, wenn erforderlich...
Delphi-Quellcode:
müsstest Du dann in der Art kommen:
AudioVolume2.SelectAudioDevice(1)
Delphi-Quellcode:
Ord beginnt bei 0 zu zählen, eventuell müsste es dann
AudioVolume2.SelectAudioDevice(Ord(FAudioDevices))
Delphi-Quellcode:
heißen.
AudioVolume2.SelectAudioDevice(Ord(FAudioDevices) + 1)
|
AW: Komponente umstellen
Zitat:
Sind vom System zu System unterschiedlich. Ich möchte eine Liste im Objektinspektor wo ich das jeweilige Device auswählen und der Komponente zuweisen kann. Aktuell steht dort TStrings logisch weil die Rückgabe nun mal TStings ist. Also was zurückgeben damit die Einträge addiert werden.
Delphi-Quellcode:
function TAudioVolume.GetAudioDevice: TStrings;
var N: integer; FDeviceList: array of TDeviceInfo; Items: TStringList; begin Items := TStringList.Create; FAudioDevice := TStringList.Create; if FDeviceCount > 0 then begin SetLength(FDeviceList, FDeviceCount); for N := 0 to (FDeviceCount - 1) do begin FDeviceList[N] := GetDeviceInfo2(DeviceCollection, N); ExtractStrings(['('], [], pWideChar(FDeviceList[N].DeviceName), Items); FAudioDevice.Add(Items[0]); Items.Clear; end; Items.Free; end; Result := FAudioDevice; end; Zitat:
Nur diese muss ich dort erst mal addieren ;) arghhh VCL :) Komme langsam zum schluss das der Objekt Inspektor in Delphi Müll ist. Kann das sein? Bool werte werden zu spät ausgewertet, Listen kann man nicht addieren usw.. Selbst mit dem alten VB6 ist so was alles möglich. Kopfschütteln. gruss |
AW: Komponente umstellen
Ich kann Dir nicht so recht folgen, wo jetzt genau Deine Probleme liegen und warum Boolean-Werte zu spät ausgewertet werden.
Ist es so, dass zur Laufzeit alles funktioniert und auch wenn Du zur Designtime Deine Werte umstellst, aber wenn Du ein Projekt startest oder ein Formular öffnest funktioniert es nicht? In dem Fall müsstest Du nachvollziehen, wann welche Werte in die DFM geschrieben und daraus wieder gelesen werden. Also schau Dir evtl. mal die DFM im Textformat an, was dort eigentlich rein geschrieben wird oder wurde. Wenn die DFM-Informationen passen musst Du schauen, wie und wann diese wieder gelesen. |
AW: Komponente umstellen
Zitat:
Problem 1. Ich erstelle ein Property FAddVolume (Boolean). Wenn ich diesen Wert im Objektinspektor ändere funktioniert soweit alles aber sobald das Formular in Delphi geschlossen und anschließend wieder geöffnet wird ist alles durcheinander. Laufzeit ist Ok. Problem 2. Ich erstelle eine Liste der vorhandenen Device Diese wird im Objektinspektor als TStrings angezeigt und nicht als Liste so wie ich es gerne hätte. Einen anderen weg habe ich noch nicht gefunden. In der DFM wird alles richtig geschrieben. Zitat:
Beim direkten ändern nicht aber beim erneuten öffnen der Form. gruss |
AW: Komponente umstellen
Also zu 1) solltest Du den Hinweis von DeddyH nochmal berücksichtigen.
Wenn Dein Formular geöffnet wird (egal ob zur Designtime oder Runtime) werden zunächst die Komponenten erstellt und DANACH werden die Werte gesetzt. Wenn Du im Konstruktor auf bestimmte Werte prüfst, ist das einfach zu früh. Du musst entweder im Setter der Eigenschaft auf Änderungen reagieren (i.d.R. die sinnvollste Lösung) oder nach den DatenAusDerDFM-lesen (in Loaded). Zu 2) weiß ich auch nicht recht. Du willst zur Designtime einen Wert als Text festlegen - richtig? Aber auf jedem System, auf dem die EXE gestartet wird, können die möglichen Werte abweichen? Insofern wäre m.E. ein Property-Editor sinnvoll, der Dir die möglichen Werte auflistet und Du EINEN als String speicherst. Beim Programmstart wird geprüft, ob dieser Wert auf dem aktuellen System verfügbar ist und dann eingestellt. Wenn nicht wird ein Dialog für die Auswahl geöffnet. In der DFM würde dann nur ein String gespeichert werden. Für bearbeitbare Listen im Formular sind TCollection vorgesehen. |
AW: Komponente umstellen
Danke erst mal.
Zitat:
Das Problem ist nur ich benötige diese abfrage in create weil sonst die ganzen Componenten nicht erstellt werden. Das führt unweigerlich zu einem AV Zitat:
Das über Index zu machen wo man noch nicht weis ob das Device überhaupt Aktiv ist scheint mir nicht der richtige weg. Also alle Device die dort angezeigt werden sollen bei einem Klick auf dem jeweiligen Eintrag der aktuellen Komponente zugewiesen werden. Nur die Lösung mit Tstrings ist ungenügend da nicht aus wählbar. gruss |
AW: Komponente umstellen
1) In Create kannst Du das nicht lösen. Das ist nicht möglich.
Also musst Du das später tun und Deine Subcontrols vor möglichen Zugriffen auf Nil prüfen oder sie immer erzeugen und Visible := False zuweisen. 2) Ich verstehe nicht, warum Du die Strings im Formular speichern willst. Die kannst Du doch entweder fest in der Komponente fixieren oder sie jeweils dynamisch zuweisen. Dann bauchst Du nur einen String und kannst prüfen, ob der zu der aktuellen Liste auf dem aktuellen System passt. Die Liste aller denkbaren Einträge müssen dann nicht im Formular gespeichert werden. |
AW: Komponente umstellen
Zitat:
Zitat:
Das erste Device existiert immer. Die AppVolume kann, muss aber nicht eingebunden werden. (Anwendungsabhängig) Wenn ich eine Liste habe im ObjektInspektor dann kann ich anhand der Einträge Device dynamisch addieren. Oder direkt so wie in meinem Sample. Die nicht aktiven Device kann man dann anhand des aktiven Status deaktivieren. Der sinn des ganzen ist einfach. Wenn ich einen festen Font einer Komponente ändern will dann mache ich das im ObjektInspektor und schreibe dafür nicht extra Code PS: Ok! Ich gebe es auf mit dem Inspektor. 1 Gerät und die Anwendungslautstärke wird addiert. Will man ein anderes Gerät verwenden muss man dieses aus der Combo laden. Dann ändert sich das Default Gerät entsprechend. gruss |
AW: Komponente umstellen
Du kannst eine eigene Klasse von TStrings ableiten und dafür dann einen Editor registrieren (RegisterComponentEditor). Da kannst du dich dann austoben was der Benutzer wie auswählen können soll.
Zu dem Problem mit Loaded: Ich glaube ohne mehr Quelltext lässt sich da nicht viel mehr helfen, da so nicht nachvollziehbar ist wo deine Probleme auftreten. Möglich ist das jedenfalls sicher... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:20 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz