Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Memo.Lines.IndexOf() auf ein anderes Memo übertragen (https://www.delphipraxis.net/119890-memo-lines-indexof-auf-ein-anderes-memo-uebertragen.html)

juergen 2. Sep 2008 21:58


Memo.Lines.IndexOf() auf ein anderes Memo übertragen
 
Hallo zusammen,

ich habe nun einiges probiert und hier auch gesucht aber nichts passendes gefunden.
Ich habe 2 Memos.
Im ersten Memo werden Dateinamen gespeichert.
Im zweiten Memo ZUSÄTZLICH der komplette Pfad zu der Datei.

mein Wunsch:
In Memo 1 markiere ich eine Zeile und würde über ein Popup-Menü den Explorer öffnen, natürlich zu der markierten Datei. :mrgreen:

Das geht mit:
Delphi-Quellcode:
  ShellExecute(0, 'open', 'explorer.exe', PChar('/select,' +
    (Memo1.SelText)), nil, SW_SHOWNORMAL);
Da ich in der markierten Memo1 Zeile ja nur den Dateinamen habe, kann ich diesen nicht an den Explorer als Parameter übergeben; da wird der komplette Pfad erwartet.
Dazu habe ich das "synchrone" 2. Memo, wo zusätzlich die Pfade mit angegeben sind.
Nun muss ich irgendwie die markierte Zeile aus Memo 1 "übergeben" an Memo 2.
Das habe ich so gemacht:
Delphi-Quellcode:
var My_MemoIndex : Integer;
My_MemoIndex := Memo2.Lines.IndexOf(Memo1.SelText);
Bedeutet, ich habe denselben Zeilenindex wie in Memo 1.

Soweit, so gut, aber:
Wie bekomme ich nun die Zeile in Memo2 kopiert oder markiert oder irgendwie als Text ausgewiesen?
, so dass ich damit den Parameter für den Explorer Memo1.SelText ersetzen kann?


Danke schonmal vorab!

Edit: Memo3 geändert in Memo 2 :oops:

Benedikt 2. Sep 2008 23:37

Re: Memo.Lines.IndexOf() auf ein anderes Memo übertragen
 
Hi,

ich weiß nicht ob ich dich richtig verstehe, aber wieso greifst du nicht einfach direkt auf Memo2.Lines zu da wo der Cursor in Memo1 steht, also: Memo2.Lines[Memo1.CaretPos.Y]

Wenn du jetzt in dem einen Memo (wieso hast du im Code noch ein Memo3 - oder ist das dein 2. Memo?), das Popup-Menü öffnest,dann könntest du den Pfad doch ganz einfach zusammen setzen:

Delphi-Quellcode:
//... Überprüfung ob die Zeilen tatsächlich existieren ...

Pfad:=IncludeTrailingPathDelimiter(Memo2.Lines[Memo1.CaretPos.Y])+Memo1.Lines[Memo1.CaretPos.Y];
In diesem Fall wäre Memo2 das Memo mit den Dateipfaden, Memo1 das wo nur die Dateinamen drinstehen und von wo das Popup geöffnet wird.


Oder meinst du was ganz anderes? :mrgreen:

MfG Benedikt

marabu 3. Sep 2008 06:36

Re: Memo.Lines.IndexOf() auf ein anderes Memo übertragen
 
Moin Jürgen,

wenn du nicht exquisite Gründe für den Einsatz der beiden Memos vorweisen kannst, dann möchte ich dir eine Lösung auf der Basis einer ListBox vorschlagen:

Delphi-Quellcode:
type
  TDemoForm = class(TForm)
    ListBox: TListBox;
    AddButton: TButton;
    OpenDialog: TOpenDialog;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure AddButtonClick(Sender: TObject);
    procedure ListBoxDblClick(Sender: TObject);
  private
    Pathes: TStrings;
  end;

var
  DemoForm: TDemoForm;

implementation

{$R *.dfm}

uses
  ShellApi;

function AddObject(strings: TStrings; const s: string; obj: Pointer = nil): Integer;
begin
  Result := strings.IndexOf(s);
  if Result < 0 then
  begin
    strings.BeginUpdate;
    Result := strings.AddObject(s, obj);
    strings.EndUpdate;
  end;
end;

procedure TDemoForm.FormCreate(Sender: TObject);
begin
  Pathes := TStringList.Create;
end;

procedure TDemoForm.FormDestroy(Sender: TObject);
begin
  Pathes.Free;
end;

procedure TDemoForm.AddButtonClick(Sender: TObject);
var
  fName, fPath: TFileName;
begin
  with OpenDialog do
    if Execute then
    begin
      fPath := ExtractFilePath(FileName);
      fName := ExtractFileName(FileName);
      ListBox.ItemIndex := AddObject(ListBox.Items, fName, Pointer(AddObject(Pathes, fPath)));
    end;
end;

procedure TDemoForm.ListBoxDblClick(Sender: TObject);
var
  h: THandle;
  fn: TFileName;
begin
  with ListBox do
    if ItemIndex >= 0 then
    begin
      fn := pathes[Integer(Items.Objects[ItemIndex])] + Items[ItemIndex];
      h := ShellExecute(Handle, 'open', PChar(fn), nil, nil, SW_SHOWNORMAL);
      if h <= 32 then
        ShowMessage(SysErrorMessage(h));
    end;
end;
Der Code lässt sich auch auf Memo umstricken. Übersetzen lässt sich das, Testen musst aber du.

Freundliche Grüße

juergen 3. Sep 2008 08:32

Re: Memo.Lines.IndexOf() auf ein anderes Memo übertragen
 
Hallo Benedikt,

Zitat:

Zitat von Benedikt
Oder meinst du was ganz anderes? :mrgreen:

MfG Benedikt

Du hattest mich genau richtig verstanden.
Bin nur nicht auf die Idee mit Caret.Pos gekommen. :thumb:
Vielen Dank!

Hallo Achim,

exquisite Gründe für die beiden Memo's gibt es eigentlich nicht. :mrgreen:
Deinen Vorschlag werde ich mir heute Abend etwas genauer anschauen.
Auch Dir danke für die Hilfe!

marabu 3. Sep 2008 17:38

Re: Memo.Lines.IndexOf() auf ein anderes Memo übertragen
 
Hallo Jürgen,

hier ist noch ein Beispiel, wie du nur mit einer einzigen Liste auskommen kannst: klick

Freundliche Grüße

juergen 3. Sep 2008 19:16

Re: Memo.Lines.IndexOf() auf ein anderes Memo übertragen
 
Hallo Achim,

das Demo-Projekt ist für mich wirklich sehr gut! :thumb:
Am Rande habe ich noch ChangeFileExt dabei kennen gelernt. Bis jetzt hatte ich da immer mit StringReplace() gearbeitet.

Da ich davon ausgehe, dass du bewußt die Verwaltung der Popup-Menüs in einer ActionList angewendet hast:
- welchen Vorteil hat das eigentlich?
Ich habe zwar die Hilfe zu TActionList gelesen, aber den Sinn habe ich an dieser Stelle nicht erkannt...

Ich werde nun mal mein bestehendes Projekt noch etwas umstellen (müssen). :mrgreen:

Vielen Dank!

marabu 3. Sep 2008 19:54

Re: Memo.Lines.IndexOf() auf ein anderes Memo übertragen
 
Actions und ActionList sind die konsequente Umsetzung der Anforderungen aus Software-Ergonomie und Barrierefreiheit bei Vermeidung von Code-Redundanz. Dein GUI-Programm soll immer mehrere Möglichkeiten zur Auslösung einer Aktion bereit stellen. Aktionen können z.B. über ein MenuItem, einen ToolButton oder einen ganz normalen Button ausgelöst werden. Die zentrale Steuerung der Benutzerschnittstelle mit einer ActionList trägt wesentlich mit zu einem übersichtlichen und wartbaren Programm bei. Du aktivierst und deaktivierst nur noch deine Actions, die Actions rekonfigurieren dann alle verknüpften Action-Komponenten.


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