AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Komponente umstellen

Ein Thema von EWeiss · begonnen am 22. Jan 2016 · letzter Beitrag vom 27. Jan 2016
Antwort Antwort
Seite 3 von 5     123 45   
EWeiss
(Gast)

n/a Beiträge
 
#21

AW: Komponente umstellen

  Alt 24. Jan 2016, 12:24
Es gibt noch die Methode Loaded, die nach dem Laden der Eigenschaften ausgeführt wird. Wenn man im Objektinspektor eingestellte Eigenschaften verwenden will ohne im Setter jedesmal etwas zu aktualisieren, kann man diese überschreiben. Dann sind alle Eigenschaften bereits gesetzt.
Ahh ok werde das mal testen.. Danke.

Habe noch ein anderes kleines Problem.
Zur zeit setze ich die Device auf diese weise per Hand.
AudioVolume2.SelectAudioDevice(1); Das ist mir aber nicht aussagekräftig genug.

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

Geändert von EWeiss (11. Jul 2019 um 15:44 Uhr)
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#22

AW: Komponente umstellen

  Alt 24. Jan 2016, 12:42
Wenn Du da im Objektinspektor was auswählen willst, nimm doch dafür 'nen Aufzählungstypen.

Sowas z. B.?
Delphi-Quellcode:
  TAudioDevices = set of (adLautsprecher, adStereoMix, acLineIn, acCDAudio);
...
    FAudioDevices: TAudioDevices;
...
    property AudioDevices: TAudioDevices read FAudioDevices write FAudioDevices; // oder halt 'nen Setter bauen, wenn erforderlich...
An die Nummer für AudioVolume2.SelectAudioDevice(1) müsstest Du dann in der Art kommen:AudioVolume2.SelectAudioDevice(Ord(FAudioDevices)) Ord beginnt bei 0 zu zählen, eventuell müsste es dann AudioVolume2.SelectAudioDevice(Ord(FAudioDevices) + 1) heißen.
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#23

AW: Komponente umstellen

  Alt 24. Jan 2016, 13:26
Zitat:
Aufzählungstypen
Kann ich nicht weil diese nicht festgelegt werden können.
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:
An die Nummer für AudioVolume2.SelectAudioDevice(1) müsstest Du dann in der Art kommen:AudioVolume2.SelectAudioDevice(Ord(FAudioDe vices)) Ord beginnt bei 0 zu zählen, eventuell müsste es dann AudioVolume2.SelectAudioDevice(Ord(FAudioDevices) + 1) heißen.
Ok das ist die Auswertung nachdem ein Eintrag aus dem Inspektor gewählt wurde.
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

Geändert von EWeiss (24. Jan 2016 um 14:59 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.336 Beiträge
 
Delphi 11 Alexandria
 
#24

AW: Komponente umstellen

  Alt 24. Jan 2016, 15:09
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.
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#25

AW: Komponente umstellen

  Alt 24. Jan 2016, 15:17
Zitat:
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?
Nein es ist so das zur Laufzeit alles geht aber zur Designtime nicht.

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:
object AudioVolume5: TAudioVolume
Left = 15
Top = 277
Width = 116
Height = 120
AppVolume = True
AudioDevice.Strings = (
'Lautsprecher '
'Stereo Mix '
'Line In '
'CD Audio ')
SuppressEvent = False
end
Der wert AppVolume wird aber zu spät erst zugewiesen.
Beim direkten ändern nicht aber beim erneuten öffnen der Form.


gruss

Geändert von EWeiss (24. Jan 2016 um 15:31 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.336 Beiträge
 
Delphi 11 Alexandria
 
#26

AW: Komponente umstellen

  Alt 24. Jan 2016, 15:56
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.
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#27

AW: Komponente umstellen

  Alt 24. Jan 2016, 16:03
Danke erst mal.
Zitat:
Also zu 1) solltest Du den Hinweis von DeddyH nochmal berücksichtigen.
Das habe ich, zumindest versucht.
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:
Du willst zur Designtime einen Wert als Text festlegen
Richtig damit der User die auf der Form geklatschte Componente ohne umschweife direkt zuweisen kann.
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

Geändert von EWeiss (24. Jan 2016 um 18:05 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.336 Beiträge
 
Delphi 11 Alexandria
 
#28

AW: Komponente umstellen

  Alt 24. Jan 2016, 16:41
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.
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#29

AW: Komponente umstellen

  Alt 24. Jan 2016, 16:52
Zitat:
In Create kannst Du das nicht lösen. Das ist nicht möglich.
Jo hat DeddyH ja schon gesagt.

Zitat:
Ich verstehe nicht, warum Du die Strings im Formular speichern willst.
Im ObjektInspektor

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

Geändert von EWeiss (24. Jan 2016 um 18:02 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.326 Beiträge
 
Delphi 11 Alexandria
 
#30

AW: Komponente umstellen

  Alt 24. Jan 2016, 19:41
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...
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:42 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz