Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Zuletzt geöffnete Dateien (im Datei-Menü) anzeigen (https://www.delphipraxis.net/4818-zuletzt-geoeffnete-dateien-im-datei-menue-anzeigen.html)

dopeline 13. Mai 2003 07:57


Zuletzt geöffnete Dateien (im Datei-Menü) anzeigen
 
Ich will, dass wenn man auf (MainMenu) "Datei" klickt, 3 oder 4 Dateien angezeigt werden, die zuletzt geöffnet wurden. wie stelle ich das an?

Grüße, dopeline :dancer:

Luckie 13. Mai 2003 08:14

Merk sie dir in einer Ini-Datei und beim Laden liest du sie aus und erstellst die Menüpunkte im Menü dynamisch. Beim Klick auf den Menüpunkt dient die Caption als Pfad zur Datei. Das wäre das einfachste.

dopeline 13. Mai 2003 08:19

:?
ich habe keinen schimmer, wie ich das anstellen soll :oops: ...

kannst du mir vielleicht ein paar ansätze zeigen :wink:


Grüße, dopeline

Luckie 13. Mai 2003 09:15

Here we go:
Delphi-Quellcode:
type
  TForm1 = class(TForm)
    MainMenu1: TMainMenu;
    mnuFile: TMenuItem;
    Dateiffnen1: TMenuItem;
    OpenDialog1: TOpenDialog;
    procedure Dateiffnen1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
    procedure MyMenuItemClick(Sender: TObject); //  OnClick-Ereignis für den Menüpunkt
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

uses
  IniFiles;

procedure TForm1.Dateiffnen1Click(Sender: TObject);
var
  ini : TInifile;
  slKeyNumbers : TStringList;
  KeyNumber : Integer;
begin
  if OpenDialog1.Execute then
  begin
    ini := TIniFile.Create(ExtractFilePath(ParamStr(0))+'\mru.ini');
    try
      slKeyNumbers := TStringList.Create;
      try
        ini.ReadSectionValues('MRU', slKeyNumbers);
        KeyNumber := slKeyNumbers.Count;
          { mein schneller Versuch die Anzahl zu begrenzen }
//        if slKeyNumbers.Count = 5 then
//        begin
//          ini.DeleteKey('MRU', '0');
//          ini.WriteString('MRU', '0', OpenDialog1.FileName);
//        end
//        else
          ini.WriteString('MRU', IntToStr(KeyNumber), OpenDialog1.FileName); // Dateiname in Ini eintragen, der Key ist eine Ziffer
      finally
        slKeyNumbers.Free; // Stringliste freigeben
      end;
    finally
      ini.Free; // Ini-Objekt freigeben
    end;
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  ini : TIniFile;
  slKeyNumbers : TStringList;
  i : Integer;
  NewItem : TMenuItem;
begin
  ini := TIniFile.Create(ExtractFilePath(ParamStr(0))+'\mru.ini');
  try
    slKeyNumbers := TStringList.Create;
    try
      ini.ReadSectionValues('MRU', slKeyNumbers); // Sektionswerte holen
      if slKeyNumbers.Count > 0 then // wenn welche da sind Trennlinie erzeugen
      begin
        NewItem := TMenuItem.Create(mnuFile);
        try
          NewItem.Caption := '-';
          mnuFile.Insert(mnuFile.Count, NewItem);
          for i := 0 to slKeyNumbers.Count-1 do // in einer Schleife alle Dateien hinzufügen (nur die Dateinamen)
          begin
            NewItem := TMenuItem.Create(mnuFile);
            NewItem.Caption := '&'+IntToStr(i)+' '+ExtractFilename(ini.ReadString('MRU', IntToStr(i), ''));
            if NewItem.Caption = '' then
              continue;
            NewItem.Tag := i; // Menüeintrag eindeutig markieren mit der Tag-Eigenschaft
            NewItem.OnClick := MyMenuItemClick; // Menüeintag mit der Ereignissprozedur verbinden
            mnuFile.Insert(mnuFile.Count, NewItem);
          end;
        finally
          NewItem.Free;
        end;
      end;
    finally
      slKeyNumbers.Free;
    end;
  finally
    ini.Free;
  end;
end;

procedure TForm1.MyMenuItemClick(Sender: TObject);
var
  ini : TiniFile;
  s  : String;
begin
  ini := TIniFile.Create(ExtractFilePath(ParamStr(0))+'\mru.ini');
  try
    s := ini.ReadString('MRU', IntToStr((Sender as TMenuItem).Tag), ''); // Schlüsselwert an Hand des Tags indentifizieren
    ShowMessage(s); // Und ausgeben
  finally
    ini.Free;
  end;
end;
Was jetzt noch fehlt ist die Begrenzung auf eine bestimmte Anzahl von Dateien. Aber etwas sollst du ja auch machen. :wink:

dopeline 13. Mai 2003 13:30

wow!

aber er ist die ganze zeit am meckern: :(
(alles in. FormCreate)

[Fehler] Uhaupt.pas(212): Undefinierter Bezeichner: 'mruFile'
an der stelle:
Delphi-Quellcode:
 NewItem := TMenuItem.Create(mnuFile);
und an der stalle:
Delphi-Quellcode:
mnuFile.Insert(mnuFile.Count, NewItem);
dort sagt er auch 2x, dass es sich in dieser zeile um "inkompatible Typen" handelt

und an folgender stelle sagt er, dass "Operator oder Semikolon fehlt", sowie 2x "inkompatible Typen" :
Delphi-Quellcode:
mnuFile.Insert(mnuFile.Count, NewItem);
Woran kann das liegen?

Gruß, dopeline

Luckie 13. Mai 2003 13:35

mnuFile heißt mein "Datei"-Menü. Das nächste wäre mnuEdit für das "Bearbeiten"-Menü.

dopeline 13. Mai 2003 13:46

Zitat:

procedure TForm1.MyMenuItemClick(Sender: TObject);
heißt so dein MainMenu?

Luckie 13. Mai 2003 13:52

Liste der Anhänge anzeigen (Anzahl: 1)
Hä? Das ist die Ereignis-Prozedur für den Klick auf einen Menü-Eintrag. Warte ich hänge das ganze mal an.

dopeline 13. Mai 2003 14:06

Ok, also die fehlermeldungen dezimieren sich :wink:

hier sagt er mir, er kenne den Bezeichner MyMenuItem nicht: (im FormCreate)
Delphi-Quellcode:
NewItem.OnClick := MyMenuItem; // Menüeintag mit der Ereignissprozedur verbinden
und oben in der privaten deklaration sagt er "Das private-Symbol 'MyMenuItemClick' wurde deklariert, aber nie verwendet"
obwohl ich die prozedur im quelltext mit drin habe. du hast doch dort gesagt "// OnClick-Ereignis für den Menüpunkt" , wo kommt denn das dann hin?

Gruß, dopeline

Stanlay Hanks 13. Mai 2003 14:09

Also so wie ich das verstehe, weißt du ihm als onclick ereignis ein menü zu. Und das kann ja nicht gehen.

Man liest sich Stanlay :coder:

Luckie 13. Mai 2003 14:17

Zitat:

Zitat von Stanlay Hanks
Also so wie ich das verstehe, weißt du ihm als onclick ereignis ein menü zu. Und das kann ja nicht gehen.

Nein tue ich nicht. ich weiße dem OnCloick-Ereignis ein Event-Hanmdler zu das ist in Ordnung.

@dopeline: Hast du auch irgendwo das:
Delphi-Quellcode:
procedure TForm1.MyMenuItemClick(Sender: TObject);
var
  ini : TiniFile;
  s  : String;
begin
  ini := TIniFile.Create(ExtractFilePath(ParamStr(0))+'\mru.ini');
  try
    s := ini.ReadString('MRU', IntToStr((Sender as TMenuItem).Tag), ''); // Schlüsselwert an Hand des Tags indentifizieren
    ShowMessage(s); // Und ausgeben
  finally
    ini.Free;
  end;
end;
geschrieben? :roll:

dopeline 13. Mai 2003 14:30

oh mann! ich bin ja vielleicht bedeppert... :oops:
ich habe MyMenuItem statt MyMenuItemClick geschrieben... :shock:

ok, also wenn ich das programm öffne, eine datei einlade, das programm wieder schließe und wieder öffne, steht unter "Beenden" die datei. das ist cool. allerdings, wenn ich jetzt 30 dateien (nacheinander) geöffnet habe, steht erst beim nächsten neustarten des programms die ganze liste von 30 dateien...
wie sage ich ihm, dass er wenn ich eine datei öffne, die dadurch eben geschlossene datei im menu angezeigt wird?

(außerdem muss da noch irgentwie eine begrenzung rein, sonst sehe ich bald mein programm nicht mehr, vor lauter einträgen *g*)

dopeline

Luckie 13. Mai 2003 14:36

Das habe ich ja geschriebn, dass da noch eien Begrenzung rein muß. Also alles kann und will ich dir nicht vorkauen. Du brauchst das ja und nicht ich.

Zu deinem anderen Problem: Kuck dir mal an, wann was in meinem Code passiert.

Etwas anpassen, mußt du ihn eben schon für deine Bedürfnisse.

dopeline 13. Mai 2003 16:52

Wie kann ich denn diese ini-datei "leeren"?
hab es jetzt so eingerichtet, dass wenn man auf "History lehren" klickt, die ini-datei gelöscht wird. aber aus irgenteinem grund wird, wenn man dann das programm startet, eine datei lädt und das programm dann neustartet, die eben geöffnete datei nicht in die ini übertragen...
liegt das vielleicht daran, dass ich die ini-datei vorher gelöscht habe und er erst bei der 2. datei diese wieder übernimmt?

Stanlay Hanks 13. Mai 2003 17:32

@Luckie: Rückzug....so weit hab ich mal wieder nicht gedacht... sorry.

Man liest sich, Stanlay :oops:

Luckie 13. Mai 2003 20:09

hast du mal in die Ini-Datei gekuckt? Wohl nicht, sonst hättest du was anderes gefragt. :roll:

Der Hund liegt hier begraben:
Delphi-Quellcode:
          for i := 0 to slKeyNumbers.Count-1 do
          begin
            NewItem := TMenuItem.Create(mnuFile);
            NewItem.Caption := '&'+IntToStr(i)+' '+ExtractFilename(ini.ReadString('MRU', IntToStr(i), ''));
            if NewItem.Caption = '' then
              continue;
            NewItem.Tag := i;
            NewItem.OnClick := MyMenuItemClick;
            mnuFile.Insert(mnuFile.Count, NewItem);
          end;
Wenn ein Eintrag drin ist, dann läuft die Schleife von? Genau 0 bis ein Eintrag minus eins, also genau wie viel mal? Gar kein mal. Nimm das minus eins bei der for-Schleife raus.

Mann, das Ding habe ich in 20 Minuten zusammengekloppt. Es sollte ja auch nur das Prinzip verdeutlichen. Ich habe nie den Anspruch auf perfekten Code erhoben. :wink:

Daniel B 13. Mai 2003 20:25

Hallo,

ich habe es nach Delphi-Language verschoben.

Grüsse, Daniel :hi:

dopeline 14. Mai 2003 13:48

@lucky
Vielen Dank für deine Hilfe! :hello: (wüsste nicht, was ich ohne dich gemacht hätte... :roll: )
kannst du mir noch sagen, wie ich verhindere, dass in dem menü einträge soppelt auftauchen? (also, wenn ich 2x die gleiche datei geöffnet habe, steht dann dort auch 2x dieselbe)

Grüße, dopeline :wink:


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