AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Komponente umstellen

Ein Thema von EWeiss · begonnen am 22. Jan 2016 · letzter Beitrag vom 27. Jan 2016
Antwort Antwort
nahpets
(Gast)

n/a Beiträge
 
#1

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
 
#2

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.355 Beiträge
 
Delphi 11 Alexandria
 
#3

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
 
#4

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.355 Beiträge
 
Delphi 11 Alexandria
 
#5

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
 
#6

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.355 Beiträge
 
Delphi 11 Alexandria
 
#7

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
Antwort Antwort


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 10:10 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