![]() |
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:
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.
ShellExecute(0, 'open', 'explorer.exe', PChar('/select,' +
(Memo1.SelText)), nil, SW_SHOWNORMAL); 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:
Bedeutet, ich habe denselben Zeilenindex wie in Memo 1.
var My_MemoIndex : Integer;
My_MemoIndex := Memo2.Lines.IndexOf(Memo1.SelText); 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: |
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:
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.
//... Überprüfung ob die Zeilen tatsächlich existieren ...
Pfad:=IncludeTrailingPathDelimiter(Memo2.Lines[Memo1.CaretPos.Y])+Memo1.Lines[Memo1.CaretPos.Y]; Oder meinst du was ganz anderes? :mrgreen: MfG Benedikt |
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:
Der Code lässt sich auch auf Memo umstricken. Übersetzen lässt sich das, Testen musst aber du.
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; Freundliche Grüße |
Re: Memo.Lines.IndexOf() auf ein anderes Memo übertragen
Hallo Benedikt,
Zitat:
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! |
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: ![]() Freundliche Grüße |
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! |
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 02:46 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz