AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Memo.Lines.IndexOf() auf ein anderes Memo übertragen
Thema durchsuchen
Ansicht
Themen-Optionen

Memo.Lines.IndexOf() auf ein anderes Memo übertragen

Ein Thema von juergen · begonnen am 2. Sep 2008 · letzter Beitrag vom 3. Sep 2008
Antwort Antwort
Benutzerbild von juergen
juergen

Registriert seit: 10. Jan 2005
Ort: Bönen
1.164 Beiträge
 
Delphi 11 Alexandria
 
#1

Memo.Lines.IndexOf() auf ein anderes Memo übertragen

  Alt 2. Sep 2008, 21:58
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.

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
Jürgen
Indes sie forschten, röntgten, filmten, funkten, entstand von selbst die köstlichste Erfindung: der Umweg als die kürzeste Verbindung zwischen zwei Punkten. (Erich Kästner)
  Mit Zitat antworten Zitat
Benedikt
(Gast)

n/a Beiträge
 
#2

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

  Alt 2. Sep 2008, 23:37
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?

MfG Benedikt
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#3

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

  Alt 3. Sep 2008, 06:36
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
  Mit Zitat antworten Zitat
Benutzerbild von juergen
juergen

Registriert seit: 10. Jan 2005
Ort: Bönen
1.164 Beiträge
 
Delphi 11 Alexandria
 
#4

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

  Alt 3. Sep 2008, 08:32
Hallo Benedikt,

Zitat von Benedikt:
Oder meinst du was ganz anderes?

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

Hallo Achim,

exquisite Gründe für die beiden Memo's gibt es eigentlich nicht.
Deinen Vorschlag werde ich mir heute Abend etwas genauer anschauen.
Auch Dir danke für die Hilfe!
Jürgen
Indes sie forschten, röntgten, filmten, funkten, entstand von selbst die köstlichste Erfindung: der Umweg als die kürzeste Verbindung zwischen zwei Punkten. (Erich Kästner)
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#5

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

  Alt 3. Sep 2008, 17:38
Hallo Jürgen,

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

Freundliche Grüße
  Mit Zitat antworten Zitat
Benutzerbild von juergen
juergen

Registriert seit: 10. Jan 2005
Ort: Bönen
1.164 Beiträge
 
Delphi 11 Alexandria
 
#6

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

  Alt 3. Sep 2008, 19:16
Hallo Achim,

das Demo-Projekt ist für mich wirklich sehr gut!
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).

Vielen Dank!
Jürgen
Indes sie forschten, röntgten, filmten, funkten, entstand von selbst die köstlichste Erfindung: der Umweg als die kürzeste Verbindung zwischen zwei Punkten. (Erich Kästner)
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#7

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

  Alt 3. Sep 2008, 19:54
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.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:08 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