Autor Beitrag
mimi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3458

Ubuntu, Win XP
Lazarus
BeitragVerfasst: So 28.09.03 13:10 
Hallo,
ich habe eine datei sie sieht so aus:
ausblenden Quelltext
1:
2:
3:
4:
5:
Test0\Test1
Test0\Test2
Test1\Test2
Test2\Test3\Test4
Test2\Test0

die soll in einem menu geladen werden. ich habe jetzt eine funktion geschrieben die das noch nicht so richtig macht wie ich es haben wollte:
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
procedure TForm1.LoadTool;
var
  Tools:TStringList;
  i,x:Integer;
  str:String;
  Menu:TMenuItem;
  SubMenu:TmenuItem;
begin
  tools:=TStringList.Create;
  tools.LoadFromFile(GetExeDir + 'config\tools1.txt');

  for i:=0 to tools.count-1 do begin
    str:=tools[i];
    Menu:=TMenuItem.Create(Self);
    SubMenu:=TMenuItem.Create(Self);

    Menu.Caption:=GetToken(str,'\',1);

    if tools1.Find(Menu.Caption) = NIL then tools1.Add(menu);
  end;

  for i:=0 to tools.count-1 do begin
    str:=tools[i];
    Menu:=TMenuItem.Create(Self);
    SubMenu:=TMenuItem.Create(Self);

    for x:=1 to NumToken(str,'\') do begin
      Menu.Caption:=GetToken(str,'\',1);

      if tools1.Find(Menu.Caption) <> NIL then begin
        SubMenu:=tools1.Find(Menu.Caption);
        SubMenu.Add(menu);
       end;
     end;
  end;

end;

wie könnte ich das problem am besten und am einfachsten lösen ?

Moderiert von user profile iconTino: Titel geändert.

_________________
MFG
Michael Springwald, "kann kein englisch...."


Zuletzt bearbeitet von mimi am Fr 03.10.03 17:44, insgesamt 1-mal bearbeitet
G-man
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 258

Win 2000, Win ME, SuSE 8.2
D5 Standard, D6 Professional
BeitragVerfasst: Mo 29.09.03 08:24 
ich würde die Dateinahmen nicht in einer datei speichern, sondern in der Registry (ist aber geschmackssache) und dann die Informationen aus der Registry auslesen und dann in das Menü schreiben.
Ist sicherlich einfacher...

_________________
...To err is human, but to really foul things up requires a computer.
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mo 29.09.03 08:34 
Ob Registry oder Datei - das nimmt sich in dem Moment nicht viel. Es klappt beides. Letztlich liegt der Fehler wohl auch nicht im Aufbau der Datei sondern irgendwo im Programmcode, und das könnte bei der Benutzung der Registry auch passieren. :)
mimi Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3458

Ubuntu, Win XP
Lazarus
BeitragVerfasst: Mo 29.09.03 17:04 
ich hasse die regedit und habe (und werde) sie nicht nutzen !!!
Wie denn auch sein, habt ihr eine lösung ???

_________________
MFG
Michael Springwald, "kann kein englisch...."
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mo 29.09.03 17:41 
Wenn du etwas hassen möchtest, dann bitte die Registry. Der arme Editor RegEdit kann doch nichts dafür, dass er für die Registry geschrieben wurde.
mimi Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3458

Ubuntu, Win XP
Lazarus
BeitragVerfasst: Mo 29.09.03 18:16 
das problem ist jetzt nicht die regedit sondern wie ich mein ziel ereichen kann.

_________________
MFG
Michael Springwald, "kann kein englisch...."
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Di 30.09.03 10:01 
mimi hat folgendes geschrieben:
das problem ist [...] wie ich mein ziel ereichen kann.

Durch Nachdenken?

Was willst du denn erreichen?
Du möchtest den Inhalt dieser Datei in ein Menü eintragen. Und wenn ich den Code betrachte, dann gehe ich davon aus, dass der Backslash die Rolle des Trenners übernehmen soll, so dass am Ende etwa folgende Menüstruktur entsteht:
ausblenden Quelltext
1:
2:
3:
4:
5:
Test0 --> Test1
          Test2
Test1 --> Test2
Test2 --> Test3 --> Test4
          Test0

Richtig?

Gut, dann vermute ich mal, dass der erste Teil wohl funktionieren wird. Sprich: du prüfst, ob die Haupteinträge (Test0 bis Test2) existieren, und wenn nicht, dann hängst du sie an den Menüpunkt (tools1) an.

Im zweiten Teil willst du dann wohl die untergeordneten Einträge anhängen. Ich muss allerdings sagen, ich kenne die Funktionen "GetToken" und "NumToken" nicht und kann deren Funktion daher nur erraten.
Ich gehe aber davon aus, dass "NumToken" die Anzahl der Strings (Felder/Tokens) zurückliefert. Im Fall von
Zitat:
ausblenden Quelltext
1:
Test2\Test3\Test4					

wäre das Ergebnis dann wohl 3. Wenn dem so ist, dann frage ich mich, warum du innerhalb der Schleife, beim Aufruf von "GetToken" die Eins benutzt
Zitat:
ausblenden Delphi-Quelltext
1:
2:
for x:=1 to NumToken(str,'\') do begin
  Menu.Caption:=GetToken(str,'\',1);

Müsste hier nicht der Schleifenwert hin, damit du die anderen Strings (Felder/Tokens) bekommst (im zitierten Beispiel also "Test3" und "Test4")?

Und da es sich um untergeordnete Menüeinträge handelt, frage ich mich, warum du weiterhin im Hauptmenü (tools1) nach der Caption suchst? Du solltest besser im jeweils übergeordneten Menüeintrag suchen, dann wird die Struktur wohl auch richtig erzeugt werden.


Zum Abschluss: Ich vermisse in dem geposteten Codeauszug die Prüfung, ob die Stringliste überhaupt erzeugt werden konnte, und ob die Datei überhaupt Textzeilen enthält.
mimi Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3458

Ubuntu, Win XP
Lazarus
BeitragVerfasst: Di 30.09.03 17:15 
Zitat:
Zum Abschluss: Ich vermisse in dem geposteten Codeauszug die Prüfung, ob die Stringliste überhaupt erzeugt werden konnte, und ob die Datei überhaupt Textzeilen enthält.

sowas kommt später dran.
Zitat:

wäre das Ergebnis dann wohl 3. Wenn dem so ist, dann frage ich mich, warum du innerhalb der Schleife, beim Aufruf von "GetToken" die Eins benutzt
Zitat:
Sourcecode:
for x:=1 to NumToken(str,'\') do begin
Menu.Caption:=GetToken(str,'\',1);


Müsste hier nicht der Schleifenwert hin, damit du die anderen Strings (Felder/Tokens) bekommst (im zitierten Beispiel also "Test3" und "Test4")?


naja diser teiel erzeug schonmal die haupt menupunkte das geht prima, nur ich weiß nicht wie ich am besten untermenu punkte erzeugen könnte.

Zitat:

Du möchtest den Inhalt dieser Datei in ein Menü eintragen. Und wenn ich den Code betrachte, dann gehe ich davon aus, dass der Backslash die Rolle des Trenners übernehmen soll, so dass am Ende etwa folgende Menüstruktur entsteht:
Code:
Test0 --> Test1
Test2
Test1 --> Test2
Test2 --> Test3 --> Test4
Test0

Richtig?


richtig.

Zitat:

Im zweiten Teil willst du dann wohl die untergeordneten Einträge anhängen. Ich muss allerdings sagen, ich kenne die Funktionen "GetToken" und "NumToken" nicht und kann deren Funktion daher nur erraten.
Ich gehe aber davon aus, dass "NumToken" die Anzahl der Strings (Felder/Tokens) zurückliefert. Im Fall von

richtig, numtoken lieft mir die anzahl der zeichen also z.b. der \ und getoken liefert mir das was zwischen \ und \ steht. und er fängt von 1 an zu zählen.

_________________
MFG
Michael Springwald, "kann kein englisch...."
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Di 30.09.03 17:52 
Hast du jetzt noch irgendeine Frage dazu, oder wie soll ich dein Posting verstehen? Evtl. Schwachpunkte habe ich dir genannt. Da ich "GetToken" und "NumToken" nicht habe (Delphi 5), habe ich eine Alternative mit der Funktion Explode von jbg probiert. Das Ergebnis war etwas einfacher als dein Konstrukt, hat aber trotzdem wunderbar funktioniert.

Allerdings habe ich die Demo wieder gelöscht. Ich gehe mal davon aus, dass du´s auch ohne mich hinbekommst. Ansonsten müsste ich das Teil noch mal rekonstruieren.
mimi Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3458

Ubuntu, Win XP
Lazarus
BeitragVerfasst: Di 30.09.03 18:02 
Zitat:

Allerdings habe ich die Demo wieder gelöscht. Ich gehe mal davon aus, dass du´s auch ohne mich hinbekommst. Ansonsten müsste ich das Teil noch mal rekonstruieren.

ja, das wäre praktisch.[/delphi]

_________________
MFG
Michael Springwald, "kann kein englisch...."
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Di 30.09.03 18:18 
Hm, ... na ja, ich werde mal nicht so sein. :) Außerdem war´s nicht viel Text, also ging die Wiederherstellung recht flott.
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
// kann sein, dass das in neuen Delphi-Versionen anders
// ist, aber D5 kennt den Typ "TStringDynArray" nicht,
// der von "Explode" benutzt wird.
// Darum hab´ ich´s als String-Array deklariert.
type
  TStringDynArray = array of string;
// Kann auch sein, dass ich die Deklaration im Beitrag
// von jbg übersehen habe. :oops:


// Explode-Funktion hier einfügen (s. Link)


procedure TForm1.Button1Click(Sender: TObject);
var
  sl      : TStringList;
  i,
  j       : integer;
  str     : TStringDynArray;
  menu,
  submenu : TMenuItem;
begin
  sl := TStringList.Create;
  if(sl <> nil) then try
    sl.LoadFromFile(ExtractFilePath(paramstr(0)) + 'tools1.txt');
    if(sl.Count > 0) then
      for i := 0 to sl.Count - 1 do begin
        str := Explode('\',sl[i]);

        if(length(str) > 0) then begin
          // Eintrag auf oberster Ebene
          menu           := tools1.Find(str[0]);
          if(menu = nil) then begin
            menu         := TMenuItem.Create(tools1);
            menu.Caption := str[0];

            tools1.Add(menu);
          end;

          // untergeordnete Einträge
          if(length(str) > 1) then
            for j := 1 to length(str) - 1 do begin
              submenu           := menu.Find(str[j]);
              if(submenu = nil) then begin
                submenu         := TMenuItem.Create(menu);
                submenu.Caption := str[j];

                menu.Add(submenu);
              end;

              menu := submenu;
            end;
        end;
      end;
  finally
    sl.Free;
  end;
end;

Explode gibt´s, wie gesagt!, in der Delphi-PRAXiS. Einfach dem obigen Link folgen und dann kopieren und einbinden.
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Di 30.09.03 18:32 
MathiasSimmack hat folgendes geschrieben:
Hm, ... na ja, ich werde mal nicht so sein. :) Außerdem war´s nicht viel Text, also ging die Wiederherstellung recht flott.
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
// kann sein, dass das in neuen Delphi-Versionen anders
// ist, aber D5 kennt den Typ "TStringDynArray" nicht,
// der von "Explode" benutzt wird.
// Darum hab´ ich´s als String-Array deklariert.
type
  TStringDynArray = array of string;
// Kann auch sein, dass ich die Deklaration im Beitrag
// von jbg übersehen habe. :oops:


a) Kennt Delphi auch nicht.
b) Hast du.
Tino
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Veteran
Beiträge: 9839
Erhaltene Danke: 45

Windows 8.1
Delphi XE4
BeitragVerfasst: Mi 01.10.03 09:18 
MathiasSimmack hat folgendes geschrieben:
Explode gibt´s, wie gesagt!, in der Delphi-PRAXiS.

Die Funktion gibt es auch hier: ...einen unterteilten String in ein Array schreiben?

Gruß
Tino
mimi Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3458

Ubuntu, Win XP
Lazarus
BeitragVerfasst: Mi 01.10.03 18:19 
es hat prima funktioniert
vielen dank "MathiasSimmack"

_________________
MFG
Michael Springwald, "kann kein englisch...."