Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi VST Node finden und neuen eintrag addieren (https://www.delphipraxis.net/120659-vst-node-finden-und-neuen-eintrag-addieren.html)

EWeiss 14. Sep 2008 18:55


VST Node finden und neuen eintrag addieren
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hier ist der anfang mit VST (Anfänger mit der Komponente)

Delphi-Quellcode:
procedure TMainForm.LoadTreeDefault;
var
  IntI  : Integer;
  IntObj : Integer;
  Data  : PTreeData;
 
begin

// ******************************************************************* //
// ************** Available Skin Sreens ****************************** //
// ******************************************************************* //
  // Größe der Struktur TTreeData zuweisen
  FSkinTree.NodeDataSize := SizeOf(TTreeData);

  // TStringList erstellen und mit Daten für die Screens füllen
  FAvailableScreens  := TStringList.Create;

  FAvailableScreens.Add('Splash');
  FAvailableScreens.Add('Mainmenu');
  FAvailableScreens.Add('Audioplayer');
  FAvailableScreens.Add('Radio');
  FAvailableScreens.Add('Equalizer');
  FAvailableScreens.Add('Gallerie');
  FAvailableScreens.Add('Relaiscontrol');
  FAvailableScreens.Add('Phone');
  FAvailableScreens.Add('Dvd');
  FAvailableScreens.Add('ExtApps');
  FAvailableScreens.Add('CaveBar');
  FAvailableScreens.Add('CaveBigBar');
  FAvailableScreens.Add('PlaylistenEditor');
  FAvailableScreens.Add('Plugin');
  FAvailableScreens.Add('CaveMessages');

  ParentNode := FSkinTree.AddChild(nil);
  Data := FSkinTree.GetNodeData(ParentNode);
  Data^.FCaption := 'Available Screens';
  Data^.FColumn1:='';

  for IntI := 0 to FAvailableScreens.Count -1 do
  begin
    ScrChildNode := FSkinTree.AddChild(ParentNode);
    Data := FSkinTree.GetNodeData(ScrChildNode);
    Data^.FCaption := FAvailableScreens.Strings[IntI];
    ScrChildNode.CheckType := ctRadioButton;
    if Data^.FCaption = 'Splash' then
      ScrChildNode.CheckState := csCheckedNormal;
  end;

// ******************************************************************* //
// ************** Available Skin Objecte ***************************** //
// ******************************************************************* //
  // TStringList erstellen und mit Daten für die Screen Objecte füllen
  FScreensObj := TStringList.Create;
  FScreensObj.Add('Bitmap');
  FScreensObj.Add('Text');

  ParentNode := FSkinTree.AddChild(nil);
  Data := FSkinTree.GetNodeData(ParentNode);
  Data^.FCaption := 'Visuals';
  Data^.FColumn1:='';

  for IntObj := 0 to FScreensObj.Count -1 do
  begin
    ObjChildNode := FSkinTree.AddChild(ParentNode);
    Data := FSkinTree.GetNodeData(ObjChildNode);
    Data^.FCaption := FScreensObj.Strings[IntObj];
  end;
  ObjChildNode.CheckType := ctNone;

  With FSkinTree.TreeOptions do
    MiscOptions := MiscOptions + [toCheckSupport];

  if not Assigned(SkinManagerInterface)then
    SkinManagerInterface := TCAVESkinManager.Create;

  SkinManagerInterface.SkinPath := SkinIni.filename;
  SkinManagerInterface.ParseIniToTree(SkinManagerInterface.SkinPath, 'Splash', FSkinTree);
   

end;
es werden zwei Bäume angelegt einer mit Available Screens und einer mit Visual
nach dem parsen einer Section in meiner Ini
Delphi-Quellcode:
SkinManagerInterface.ParseIniToTree(SkinManagerInterface.SkinPath, 'Splash', FSkinTree);
vergleiche ich die einträge der section bsp.. ob eine variable 'background' vorhanden ist
wenn vorhanden dann möchte ich diese der ChildNode 'Bitmap' hinzu addieren.

Mein Problem ist nun wie finde ich diesesn Eintrag ?

gruss Emil

toms 14. Sep 2008 19:49

Re: VST Node finden und neuen eintrag addieren
 
Einen Node kannst du mit Hilfe von IterateSubtree() finden.

EWeiss 14. Sep 2008 20:05

Re: VST Node finden und neuen eintrag addieren
 
Zitat:

Zitat von toms
Einen Node kannst du mit Hilfe von IterateSubtree() finden.

Danke ;)
Werd mal schaun was ich im Forum darüber finde.

EDIT:
Wäre nicht schlecht wenn mir jemand sagen könnte ob mein source so in ordnung geht
Oder ob man es besser machen kann .. wenn ja dann bitte wie ?


gruss Emil

toms 14. Sep 2008 20:24

Re: VST Node finden und neuen eintrag addieren
 
Ich verstehe nicht ganz, warum du TStringList verwendest.

EWeiss 14. Sep 2008 20:45

Re: VST Node finden und neuen eintrag addieren
 
Zitat:

Zitat von toms
Ich verstehe nicht ganz, warum du TStringList verwendest.

Dann meine gegenfrage was würdest du verwenden ?
Ich muss das Tree ja irgendwie füllen ..

Dachte halt das ist die einfachste Methode um die Komponente erstmal kennen zu lernen.

gruss Emil

toms 14. Sep 2008 20:56

Re: VST Node finden und neuen eintrag addieren
 
Zitat:

Zitat von EWeiss
Zitat:

Zitat von toms
Ich verstehe nicht ganz, warum du TStringList verwendest.

Dann meine gegenfrage was würdest du verwenden ?
Ich muss das Tree ja irgendwie füllen ..

Nun, du füllst zuerst eine TStringList und dann den VST. Die Werte sind ja alle vordefiniert. Diese kannst du
auch in ein Array schreiben:

Delphi-Quellcode:
const AvailableScreens:
  array[0..X] of Char = ('Splash', 'Mainmenu', '..');

EWeiss 14. Sep 2008 21:11

Re: VST Node finden und neuen eintrag addieren
 
Zitat:

Zitat von toms
Zitat:

Zitat von EWeiss
Zitat:

Zitat von toms
Ich verstehe nicht ganz, warum du TStringList verwendest.

Dann meine gegenfrage was würdest du verwenden ?
Ich muss das Tree ja irgendwie füllen ..

Nun, du füllst zuerst eine TStringList und dann den VST. Die Werte sind ja alle vordefiniert. Diese kannst du
auch in ein Array schreiben:

Delphi-Quellcode:
const AvailableScreens:
  array[0..X] of Char = ('Splash', 'Mainmenu', '..');

Ja oder in einer Type

Delphi-Quellcode:
  TCAVEAvailableScreensType = (stSplash, stMainmenu);
  AvailableScreens: array[TCAVEAvailableScreensType] of string = ('Splash', 'Mainmenu');
Denke aber alle möglichkeiten sind grundsätzlich gleich da am ende ein Array of bei rauskommt.
Ob nun einen StringListe befüllt wird oder ein array.

Mit dem IterateSubtree komme ich nicht so recht klar , mein problem
weiss nicht wann ich diese aufrufen soll da die abfrage beim einlesen der INI erfolgen muss.

Hier meine INI
Delphi-Quellcode:
procedure TCAVESkinManager.ParseIniToTree(INIFileName: string; Section: string; TreeView: TVirtualStringTree);

  function IdOf(s: string): string;
  begin
    if pos('=', s) = 0 then
      result:=s
    else
      result := copy(s, 1, pos('=', s) - 1);
  end;

  function ValOf(s: string): string;
  begin
    result := copy(s, pos('=', s) + 1, length(s));
  end;

var
  INI         : TIniFile;    // Ini File
  Value       : TStringList; // Ergebnis
  Node, Parent : PVirtualNode; // Node
  IntSect     : integer;     // Zähler für Section
  IntValue    : integer;     // Zähler für Ergebnis
  Data        : PTreeData;
  NewSection  : TStrings;    // Strings in TStrings convertieren

begin
  if FileExists(INIFileName) then begin
    // ImiFile initialisieren
    INI := TIniFile.Create(INIFileName);
    // TStringList für Ergebnis initialisieren
    Value := TStringList.Create;
    // TStringList zur convertierung (Section..string)
    // zu TStrings initialisieren
    NewSection := TStringList.Create;

    // string zur TStringListe addieren
    NewSection.Add(Section);
    try
        Parent := TreeView.AddChild(nil);

        INI.ReadSectionValues(Section, Value);
        for IntValue := 0 to Value.Count - 1 do begin
          Node:=TreeView.AddChild(Parent);
          Data := TreeView.GetNodeData(Node);
          Data^.FCaption:=IdOf(Value[IntValue]);
          Data^.FColumn1:=ValOf(Value[IntValue]);
        end;
    finally
      INI.Free;
      NewSection.Free;
      Value.Free;
    end;
  end;
end;
Wenn
Delphi-Quellcode:
Data^.FCaption:=IdOf(Value[IntValue]);
den Wert Background enthält sollte zu Bitmap dieser eintrag addiert werden.
den Wert Label enthält sollte zu Text dieser eintrag addiert werden.

Keine Idee wie ich das am besten verwirklichen kann.

Das Video von generic bringt mich auch nicht weiter da es komplett anders aufgebaut ist.

gruss Emil


Alle Zeitangaben in WEZ +1. Es ist jetzt 18: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