![]() |
Drag&Drop
Bei Den RichEdits ist Drag&Drop ja schon eingebaut. Bei Memos nicht. Gibt es da irgendwas zu machen, oder muss ich wohl oder übel ein RichEdit nehmen???
|
Delphi-Quellcode:
type
TForm1 = class(TForm) Memo1: TMemo; procedure FormCreate(Sender: TObject); private { Private-Deklarationen } procedure WMDROPFILE (var msg: TMessage ); Message WM_DropFiles ; public { Public-Deklarationen } end; var Form1: TForm1; implementation uses shellapi; {$R *.dfm} procedure TForm1.WMDROPFILE(var msg: TMessage); var hDrop : Cardinal ; fName : array[0..MAX_PATH] of Char ; begin hDrop := Msg.WParam ; fName := '' ; DragQueryFile(hDrop, 0, fName, MAX_PATH); Memo1.Lines.LoadFromFile(String(fName)); DragFinish (hDrop); end; procedure TForm1.FormCreate(Sender: TObject); begin DragAcceptFiles(Handle,True ); end; |
sorry, ich meinte: text aus dem memo markieren, mit der maus drüber und dann den text verschieben. nicht ne datei öffnen.
|
Mist 15 Minuten umsonst programmiert und im Internet zusammengesucht. Kannst du das nicht trotzdem irgendwie in dein Programm einbauen? :roll:
|
Natürlich kann ich. Dann nehm ich das zum Öffnen von Dateien mit dazu. Und außerdem nehm ich jetzt doch RichEdits. Ist mir zu dumm, das mit Memos zu machen.
Eine Frage noch: Kann man irgendwie was machen in die Richtung, dass wenn man wenn man einen String auf einem Label droppt, er dann zu einem Richedit dazugefügt wird???; Danke schonmal, für das mit Datei öffnen, und viel Spass beim meine-Fragen-beantworten! :wink: :wink: :wink: |
irgendwas in die richtung:
Delphi-Quellcode:
procedure Label1OnDrop(???);
begin if (??? is Stirng) then memo.lines.append(???); end; |
Was soll den Auf das Label gezogen werden? Ich habe das jetzt so verstanden, dass das, was du auf das Label ziehst im Memo erscheinen soll. Aber was wird von wo auf das Label gezogen?
|
Ich hab den Code jetzt getestet. Der klappt nicht richtig. Man kann zwar Dateien droppen, aber die werden dann nicht geöffnet.
Ausserdem nimmt mein Delphi
Delphi-Quellcode:
type
TForm1 = class(TForm) Memo1: TMemo; procedure FormCreate(Sender: TObject); private { Private-Deklarationen } procedure WMDROPFILE (var msg: TMessage ); Message WM_DropFiles ; [color=#ff0000]Das hier nicht an[/color] public { Public-Deklarationen } end; |
Du brauchst: Label1 (Ziel), Label2 (Quelle) und ein Memo. Wenn du jetzt von Label2 nach Label1 ziehst, erscheint der Text von Label2 in Label1 und wird ins Memo eingefügt:
Delphi-Quellcode:
procedure TForm1.Label2MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer); begin if Button = mbLeft then Label2.BeginDrag(false); end; procedure TForm1.Label1DragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean); begin if Source is TLabel then Accept := true; end; procedure TForm1.Label1DragDrop(Sender, Source: TObject; X, Y: Integer); begin if Source is TLabel then begin Label1.Caption := Label2.Caption; Memo1.Lines.Add(Label2.Caption); end; end; |
Zitat:
|
chronologisch:
-ich will drag und drop, drück mich falsch aus -du gibts mir mit file open -ich frag noch mal nach -du bist enttäuscht -ich sag, dass ich beides einbau -du gibst mir das mit text statt file auch noch jetzt kommt: -ich teste, ob das mit dem text klappt -ich suche den fehler in dem mit der datei |
Moin Nailor,
Du musst statt WM_DROPFILES WMDROPFILES nehmen, dann sollte es gehen. |
Nein, er hat es schin richtig gemacht, er muß nur auch das ganze implementieren, sonst klappt es nicht.
Ich weiß immer noch nicht, was du willst. :( Zitat:
|
also ich will genau folgendes:
ein pagecontrol, ind dem jede geöffnete textdatei ein tabsheet bekommt. markiert man jetzt in einer textdatei (in einem Richedit) den text, kann man ihn ja verschieben. nun soll man ihn aber auf ein anderes Tabsheet "droppen" können, und dann soll er beim jeweiligen RichEdit hinten angehängt werden. Wenn das mit den TabSheets nicht geht, kann man alternativ auch Labels oder Panels oder so was nehmen. Nur halt nicht das andere RichEdit direkt, weil das bei 10 Dateien nicht mehr alles so gut auf einen desktop passt! |
Noch ein Versuch:
Ich will, dass folgendes geht: 1. Ich starte mein Programm aus einm Arbeitsplatz-Ordner 2. Ich geh mit der Maus aus meinem Programm, in den Ordner, klick die Project1.dpr an und halte gedrückt 3. Ich zieh die Maus wieder in mein Programm, und lass los 4. Irgendwo steht nun ein String mit dem Pfad+Namen der Datei (also in nem Edit, als Caption, als string in einer Variable...) |
Hallöchen,
ich wollte nur mal schnell dem Luckie meinen Dank aussprechen, der drag & drop code ist echt klasse, also deine Arbeit war mit Sicherheit umsonst, aber nicht vergebens. :spin: Gruß Jan |
Hallo Nailor,
ich habe diese Beiträge gelesen und weiß immer noch nicht genau, was Du eigentlich willst. Es gibt zwar ein Haufen Interpretationen, aber eindeutig ist's wohl nicht. Du öffnest Dein Programm und es wird ein Memo oder RichEdit angezeigt. Das ist erstmal leer. Jetzt minimierst Du Deine Anwendung, damit als Icon irgendwo abgelegte Text(??)-Dateien sichtbar werden, z.B. Project1.dpr Du siehst das Symbol auf Dein Memo und beim Loslassen soll Dein Programm die entsprechende Datei prüfen, ob es sich um eine Datei mit lesbaren Text handelt (keine EXE, DLL, GIF, PPS, ...) und, sollte es ein Text sein, öffnen, den gesamten Inhalt makieren und diesen dann in den Zwischenspeicher kopieren. Diese Kopie soll anschließend an der Stelle, an dem sich der Cursor in Deinem Memo befindet eingefügt werden. Dann wiederholst Du das Ganze mit dem nächsten Text z.B Projekt.pas Anschließend kannst Du Dein Memo bearbeiten, sicherlich speichern (??) Habe ich das so richtig verstanden? mfg eddy |
Hallo Nailor,
vielleicht hilft Dir das weiter:
Code:
Im Explorer angeklickte Dateien (eine oder mehrere) werden ins Memo der eigenen Anwendung gezogen. Nach loslassen der Maustaste werden diese im Memo eingetragen.
procedure TFTest.WMDROPFILE(var msg: TMessage);
var hDrop : Cardinal ; fName : array[0..MAX_PATH] of Char ; fnnew, fnold : string; i : integer; begin hDrop := Msg.WParam ; fName := '' ; i := 0; fnold := ''; DragQueryFile(hDrop, i, fName, MAX_PATH); fnnew := string(fName); while fnnew <> fnold do begin fnold := fnnew; Memo2.Lines.LoadFromFile(String(fName)); Memo2.SelectAll; Memo2.CopyToClipboard; Memo1.SelStart := Memo1.GetTextLen; Memo1.Lines.Add(''); Memo1.Lines.Add(''); Memo1.Lines.Add(''); Memo1.Lines.Add(fnnew); Memo1.Lines.Add(''); Memo1.PasteFromClipboard; // RichEdit1.Lines.LoadFromFile(String(fName)); inc(i); DragQueryFile(hDrop, i, fName, MAX_PATH); fnnew := string(fName); end; DragFinish (hDrop); end; procedure TFTest.FormCreate(Sender: TObject); begin DragAcceptFiles(Handle,True); end; Das Löschen des Memo's sowie die Auswertung, ob die ins Memo gezogene Datei auch lesbarer Text ist, sind hier noch nicht enthalten. Die Variante, aus TabSheet's Text ins Memo zu transferieren ist noch einfacher: - Text markieren - Text in den Zwischenspeicher - Text in Memo aus Zwischenspreicher mfg eddy |
soweit alles schön und gut! Aber es läuft nicht! Was muss ich einbinden für: DragQueryFile, DragFinish, DragAcceptFiles? Mit dem Code den ich habe sind das Undefined Identifiers. :cry:
|
Hallo Nailor,
Code:
steht im ersten Beitrag von Luckie zu diesem Thema!
uses
shellapi; mfg eddy |
Moin Nailor,
[EDIT] ich hatte die zweite Seite des Threads übersehen :oops: [/EDIT] |
Klappt!!! :firejump: :firejump:
KAnn man jetzt noch irgendwie die AVs verhindern, wenn man einen Ordner droppt? |
Hallo Nailor,
entweder Du prüfst, ob die Datei existiert oder mit try - except Ich habe das 2. verwendet:
Code:
mfg
procedure TFTest.WMDROPFILE(var msg: TMessage);
var hDrop : Cardinal ; fName : array[0..MAX_PATH] of Char ; fnnew, fnold : string; i : integer; begin hDrop := Msg.WParam ; fName := '' ; i := 0; fnold := ''; DragQueryFile(hDrop, i, fName, MAX_PATH); fnnew := string(fName); while fnnew <> fnold do begin fnold := fnnew; try Memo2.Lines.LoadFromFile(String(fName)); Memo2.SelectAll; Memo2.CopyToClipboard; Memo1.SelStart := Memo1.GetTextLen; Memo1.Lines.Add(''); Memo1.Lines.Add(''); Memo1.Lines.Add(''); Memo1.Lines.Add(fnnew); Memo1.Lines.Add(''); Memo1.PasteFromClipboard; except MessageDlg(fnnew + ' konnte nicht geöffnet werden', mtError, [mbOK], 0); end; // RichEdit1.Lines.LoadFromFile(String(fName)); inc(i); DragQueryFile(hDrop, i, fName, MAX_PATH); fnnew := string(fName); end; DragFinish (hDrop); end; eddy PS: was heißt "AVs" auf Deutsch? |
Zugriffsverletzung glaub ich, falls sich das so schreibt
|
Sorry, dass ich deinen Code so verstümmelt habe, aber warum geht das nicht?
Delphi-Quellcode:
Es kommt noch nichtmal eine MessageBox mit zwei Sternchen, aber der Drag&Drop-Zeiger kommt :?
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, ShellApi; procedure WMDROPFILE(var msg: TMessage); procedure TForm1.WMDROPFILE(var msg: TMessage); var hDrop: cardinal; fName: array[0..MAX_PATH] of char; begin hDrop := Msg.WParam; fName := '' ; DragQueryFile(hDrop, 0, fName, MAX_PATH); ShowMessage('*' + string(fName) + '*'); //LabeledEdit1.Text := string(fName); DragFinish (hDrop); end; procedure TForm1.FormCreate(Sender: TObject); begin DragAcceptFiles(Handle,True); end; |
Hallo Nailor,
es gibt da einen kleinen Unterschied zwischen Deinem Code und dem von Luckie übernommenen Code:
Delphi-Quellcode:
Der kleine Unterschied macht's!
private
{ Private-Deklarationen } procedure WMDROPFILE (var msg: TMessage ); Message WM_DropFiles ; // procedure WMDROPFILE(var msg: TMessage); mfg eddy |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:11 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