Einzelnen Beitrag anzeigen

bronstein

Registriert seit: 3. Feb 2004
28 Beiträge
 
Delphi XE2 Professional
 
#4

Re: dynamisches Menü mit labels Konfiguration durch INI-File

  Alt 10. Mär 2007, 16:48
Nach langem herumversuchen habe ich jetzt herrausgefunden, dass der Fehler nicht beim Löschen der Labels liegt.

Wenn ich die Funktion MenueAktualisieren beim editEvent herrausnehme, dann bekomme ich keinen Fehler. In dieser Funktion werden die Labels ja wieder erstellt.

Wenn ich jetzt auf ein Edit klicke, sind alle Labels weg.

Die Funktion MenueAktualisieren muss aber nach dem Löschen der Labels aufgerufen werden, damit ich das entsprechende Menü wieder sehe.

Habe jetzt versucht, die Funktion in einem TimerEvent auszuführen, doch da bekomm ich die selbe Fehlermeldung.

Hier mal mein der aktuelle Code:

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, IniFiles, StdCtrls, ComCtrls, jpeg, ExtCtrls, DateUtils;

const
  WM_DESTROY_LBL = WM_USER + 1;

type
  TForm1 = class(TForm)
    Panel1: TPanel;
    Panel2: TPanel;
    Image1: TImage;
    Button1: TButton;
    Button2: TButton;
    Label1: TLabel;
    Edit1: TEdit;
    procedure FormCreate(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
    procedure editEvent(sender : TObject);
    procedure Label_erstellen(aname, text: String; tmpleft, tmptop, LabelIndex: Integer; Komponent : TComponent; WinKontrol: TWinControl);
    procedure DestoryLabel(var msg : TMessage); message WM_DESTROY_LBL;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  LabelArray: array of TLabel;


implementation

{$R *.dfm}

function Teilstring_Ersetzen(Text, Suchen, Ersetzen:String):String;
var Flags: TReplaceFlags;
begin
  Flags:=[];
  Flags:=[rfIgnoreCase];
  // ohne rfReplaceAll wird nur die erste Fundstelle ersetzt
  // durch rfIgnoreCase wird Groß- und Kleinschreibung ignoriert
  result:=StringReplace(Text, Suchen, Ersetzen, Flags);
  // 'Suchen' ist der zu ersetzende Teil, 'Ersetzen' der neu eingefügte Teil
end;

function Zeichen_Ersetzen(Text: String; altZeichen: char; neuZeichen: char):String;
begin
  while Pos(altZeichen, Text) > 0 do
    Text[Pos(altZeichen, Text)] := neuZeichen;
  result:= Text;
end;

procedure LinkFarbe(Index: Integer);
var
  i: Integer;
begin
  //Farben für den Link bestimmen, wenn man die For schleife weg lässt werden alle Unterpunkte grau
  for i:=0 to 29 do
  begin
    if LabelArray[i] <> nil then
    begin
      LabelArray[i].Font.Color := clBlue;
    end;
  end;
  LabelArray[Index].Font.Color := clGray;
end;

procedure Bild_Laden(Pfad: String);
var
  tmpFloat: Extended;
begin
  Pfad := Teilstring_Ersetzen(Pfad, 'Jahr', IntToSTr(YearOf(now)));
  Pfad := Teilstring_Ersetzen(Pfad, 'Monat', FormatDateTime('mmmmm', now));
  if FileExists(pfad) then
    Form1.Image1.Picture.LoadFromFile(Pfad)
  else
    Form1.Image1.Picture.LoadFromFile('C:\Dokumente und Einstellungen\Hans\Desktop\Diagramme\Foto\fehler.jpg');


  //Bildgröße an Bildschirmgröße anpassen
  tmpFloat := Form1.Image1.Picture.Width / 100;
  tmpFloat := Form1.Image1.Width / tmpFloat;
  tmpFloat := (Form1.Image1.Picture.Height / 100) * tmpFloat;
  Form1.Image1.Height := Trunc(tmpFloat);

 { Form1.Button1.Top := Form1.Image1.Top + Form1.Image1.Height + 5;
  Form1.Button2.Top := Form1.Image1.Top + Form1.Image1.Height + Form1.Button1.Height + 10;}

end;

procedure MenueAktualisieren(Komponent : TComponent; WinKontrol: TWinControl; aktLink: String);
var
  LinkAnzahl1, LinkAnzahl2, LinkAnzahl3, LinkAnzahl4, LinkAnzahl5, LinkAnzahl6, LinkAnzahl7: Integer;
  a, b, c, d, e, f: Integer;
  tmpLink1, tmpLink2, tmpLink3, tmpLink4, tmpLink5, tmpLink6, tmpLink7: String;
  LabelIndex, top: Integer;

  ini: TiniFile;
  Dauer, tmp: Integer;
  sl: TStringList;
  i, oben: Integer;
  tmpStr, tmpPfad, pfad: String;
begin
  LabelIndex := 0;
  top := 60;
  pfad := ExtractFilePath(ParamStr(0));
  pfad := pfad + 'CockpitChart.ini';
  ini:=TIniFile.Create(pfad);
  LinkAnzahl1 := ini.ReadInteger('RootItems','RootItemsCount', LinkAnzahl1);
  for a:=1 to LinkAnzahl1 do //Menü Stufe 1
  begin
    tmpStr := ini.ReadString('RootItems', 'Item' + IntToStr(a), tmpStr);
    tmpLink1 := 'Link' + IntToStr(a);
    Form1.Label_erstellen(tmpLink1, tmpStr, 5, top, LabelIndex, Komponent, WinKontrol);
    inc(LabelIndex);
    top := top + 20;
    LinkAnzahl2 := ini.ReadInteger(tmpLink1,'ItemsCount', LinkAnzahl2);

    if copy(aktLink, 1, 5) = tmpLink1 then
    begin
      tmpPfad := ini.ReadString('RootItems', 'Image' + IntToStr(a), tmpPfad);
      Bild_Laden(tmpPfad);
      LinkFarbe(LabelIndex-1);
      for b:=1 to LinkAnzahl2 do //Menü Stufe 2
      begin
        tmpStr := ini.ReadString(tmpLink1, 'Item' + IntToStr(b), tmpStr);
        tmpLink2 := 'Link' + IntToStr(a) + '.' + IntToStr(b);
        Form1.Label_erstellen(tmpLink2, tmpStr, 15, top, LabelIndex, Komponent, WinKontrol);
        inc(LabelIndex);
        top := top + 20;
        LinkAnzahl3 := ini.ReadInteger(tmpLink2,'ItemsCount', LinkAnzahl2);

        if copy(aktLink, 1, 7) = tmpLink2 then
        begin
          tmpPfad := ini.ReadString(tmpLink1, 'Image' + IntToStr(b), tmpPfad);
          Bild_Laden(tmpPfad);
          LinkFarbe(LabelIndex-1);
          for c:=1 to LinkAnzahl3 do //Menü Stufe 3
          begin
            tmpStr := ini.ReadString(tmpLink2, 'Item' + IntToStr(c), tmpStr);
            tmpLink3 := 'Link' + IntToStr(a) + '.' + IntToStr(b) + '.' + IntToStr(c);
            Form1.Label_erstellen(tmpLink3, tmpStr, 25, top, LabelIndex, Komponent, WinKontrol);
            inc(LabelIndex);
            top := top + 20;
            LinkAnzahl4 := ini.ReadInteger(tmpLink3,'ItemsCount', LinkAnzahl4);

            if copy(aktLink, 1, 9) = tmpLink3 then
            begin
              tmpPfad := ini.ReadString(tmpLink2, 'Image' + IntToStr(c), tmpPfad);
              Bild_Laden(tmpPfad);
              LinkFarbe(LabelIndex-1);
              for d:=1 to LinkAnzahl4 do //Menü Stufe 4
              begin
                tmpStr := ini.ReadString(tmpLink3, 'Item' + IntToStr(d), tmpStr);
                tmpLink4 := 'Link' + IntToStr(a) + '.' + IntToStr(b) + '.' + IntToStr(c) + '.' + IntToStr(d);
                Form1.Label_erstellen(tmpLink4, tmpStr, 35, top, LabelIndex, Komponent, WinKontrol);
                inc(LabelIndex);
                top := top + 20;
                LinkAnzahl5 := ini.ReadInteger(tmpLink4,'ItemsCount', LinkAnzahl5);

                if copy(aktLink, 1, 11) = tmpLink4 then
                begin
                  tmpPfad := ini.ReadString(tmpLink3, 'Image' + IntToStr(d), tmpPfad);
                  Bild_Laden(tmpPfad);
                  LinkFarbe(LabelIndex-1);
                  for e:=1 to LinkAnzahl5 do //Menü Stufe 5
                  begin
                    tmpStr := ini.ReadString(tmpLink4, 'Item' + IntToStr(e), tmpStr);
                    tmpLink5 := 'Link' + IntToStr(a) + '.' + IntToStr(b) + '.' + IntToStr(c) + '.' + IntToStr(d) + '.' + IntToStr(e);
                    Form1.Label_erstellen(tmpLink5, tmpStr, 45, top, LabelIndex, Komponent, WinKontrol);
                    inc(LabelIndex);
                    top := top + 20;
                    LinkAnzahl6 := ini.ReadInteger(tmpLink5,'ItemsCount', LinkAnzahl6);

                    if copy(aktLink, 1, 13) = tmpLink5 then
                    begin
                      tmpPfad := ini.ReadString(tmpLink4, 'Image' + IntToStr(d), tmpPfad);
                      Bild_Laden(tmpPfad);
                      LinkFarbe(LabelIndex-1);
                      for f:=1 to LinkAnzahl6 do //Menü Stufe 6
                      begin
                        tmpStr := ini.ReadString(tmpLink5, 'Item' + IntToStr(f), tmpStr);
                        tmpLink6 := 'Link' + IntToStr(a) + '.' + IntToStr(b) + '.' + IntToStr(c) + '.' + IntToStr(d) + '.' + IntToStr(e) + '.' + IntToStr(f);
                        Form1.Label_erstellen(tmpLink6, tmpStr, 55, top, LabelIndex, Komponent, WinKontrol);
                        inc(LabelIndex);
                        top := top + 20;
                        LinkAnzahl7 := ini.ReadInteger(tmpLink6,'ItemsCount', LinkAnzahl7);

                        if copy(aktLink, 1, 15) = tmpLink6 then
                        begin
                          tmpPfad := ini.ReadString(tmpLink5, 'Image' + IntToStr(f), tmpPfad);
                          Bild_Laden(tmpPfad);
                          LinkFarbe(LabelIndex-1);
                        end;
                      end;
                    end;
                  end;
                end;
              end;
            end;
          end;
        end;
      end;
    end;
  end;
end;

procedure TForm1.Label_erstellen(aname, text: String; tmpleft, tmptop, LabelIndex: Integer; Komponent : TComponent; WinKontrol: TWinControl);
var Test: TLabel;
begin
  aname := Zeichen_Ersetzen(aname, '.', '_');
  LabelArray[LabelIndex] := TLabel.Create(Komponent);

  with LabelArray[LabelIndex] do
  begin
    parent := WinKontrol;
    left := tmpleft;
    top := tmptop;
    name := aname;
    Caption := text;
    onClick := editEvent;
    //Font.style := [fsBold];
    if Screen.Width <= 1360 then
      font.size := 8
    else
      font.size := 12;
    font.color := clBlue;
  end;
end;


procedure TForm1.DestoryLabel(var msg: TMessage);
begin
  if msg.Msg = WM_DESTROY_LBL then
    TLabel(msg.WParam).Free;
end;

procedure TForm1.editEvent(sender : TObject);
var
  name: String;
  i: Integer;
begin
  name := TLabel(sender).Name;
  name := Zeichen_Ersetzen(name, '_', '.');

   //Versuch1
  for i:=0 to 29 do
  begin
    if LabelArray[i] <> nil then
    begin
      if LabelArray[i].Name <> TLabel(sender).Name then
      begin
        LabelArray[i].Free;
        LabelArray[i] := nil;
      end
      else
      begin
        SendMessage(self.Handle, WM_DESTROY_LBL, Integer(LabelArray[i]), 0);
        LabelArray[i] := nil;
      end;
    end;
  end;
  Edit1.Text := name;
  //MenueAktualisieren(self, self, name);
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  Fensterbreite, tmp: Integer;
begin
  SetLength(LabelArray, 30);
  MenueAktualisieren(self, self, 'Link2.2');

   //Objekte an Größe anpassen
  if Screen.Width <= 1360 then
  begin

    Image1.Left := 150;
  end
  else
    Image1.Left := 240;

  Fensterbreite := Screen.Width;
  Label1.Left := (Fensterbreite div 2) - (Label1.Width div 2);

  Form1.Panel1.Left := 0;
  Form1.Panel1.Width := Fensterbreite;

  Image1.Width := (Fensterbreite - Image1.Left) - 10;

  tmp := Fensterbreite - Image1.left;
  tmp := tmp div 2;
  tmp := tmp + Image1.Left - (Button1.Width div 2);
  Button1.Left := tmp ;

  tmp := Fensterbreite - Image1.left;
  tmp := tmp div 2;
  tmp := tmp + Image1.Left - (Button2.Width div 2);
  Button2.Left := tmp ;
  //Hintergrundfarbe
  Form1.Color := RGB(15, 185, 185);
  Form1.Panel1.Color := RGB(15, 185, 185);

  Button1.Top := Image1.Top + Image1.Height + 50;
  Button2.Top := Image1.Top + Image1.Height + 80;
    //Fenster maximieren
  Form1.WindowState := wsMaximized;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  MenueAktualisieren(self, self, Edit1.Text);
end;

end.
  Mit Zitat antworten Zitat