Hallo zusammen,
ich würde gerne in ein Richtextconrol Datein per Drag-and-Drop hinzufügen. Nur sollen sie als Verknüpft werden mit der Datei und nicht koppiert werden.
MfG Flo
Hallo zusammen,
ich würde gerne in ein Richtextconrol Datein per Drag-and-Drop hinzufügen. Nur sollen sie als Verknüpft werden mit der Datei und nicht koppiert werden.
MfG Flo
Vielleicht hilft dieser Thread aus dem engl. Forum: https://www.autoitscript.com/f…2-simple-dropbox-for-urls
Hallo water,
leider hat mir das nichts gebracht. Ich kann erkennen, wenn eine Drag-And-Drop-Aktion passiert ist, in dem ich schaue, was mir die funktion _GUICtrlRichEdit_GetNextUndo zurückgibt. Aber ich habe leider nicht rausgefunden, wie ich die Objekte, welche automatisch eingefügt werden, manipulieren kann, weil das für mich einfach nur sinnlose Zahlen und Buchstaben sind.
Auch habe ich leider nicht rausfinden können, wie ich beeinflussen kann, was bei einem doppel klick auf ein solches Objekt passieren soll.
Ich rede von diesen Objekten:
Nur sollen sie als Verknüpft werden mit der Datei und nicht koppiert werden.
Du möchtest also den Dateipfad dort als Link ablegen? Aber was willst du dann damit machen? Soll dieser Link anklickbar sein und eine hinterlegte Anwendung starten?
Grundsätzlich halte ich das RichEdit Control dafür als ziemlich ungeeignet. Nicht das das Vorhaben damit nicht umsetzbar wäre, aber der Aufwand ist m.E. zu groß.
Vielleicht gibst du mal genauer an, was du als Ziel hast, dann kann man vermutlich bessere Lösungsansätze bieten.
Ich bin dabei ein Projektmanager zuschreiben, welcher alle Datein auflistet, welche in einem Ordner sind, und dort dann möglichkeiten bietet die text-Datei zu bearbeiten, zum Beispiel einen Eintrag mit Zeitstempel einzufügen, die Datein zu durch suchen und die Suchergebnisse dann unteranderem Hervorzuheben,...
Jetzt bin ich gerade dabei, das man Datein ablegen kann, welche sich dann öffnen, sobald man draufklickt, aber es sollen eben die Orginalen Datein geöffnet werden.
Blöde Frage Floooooo24 : Warum machst du das nicht einfach, das die Dateien aufgelistet werden und dann per z.B. Doppelklick im Default Editor des Nutzers bearbeitet werden?
So habe ich das bei mir gemacht. Dann kann der Nutzer selber wählen mit welchem Programm er die Datei bearbeiten möchte.
Floooooo24 : Aber wenn ich die Datei doch sowieso zu packen habe, warum öffne ich sie nicht direkt, sondern soll sie nochmal in dein Programm vorher schieben?
Sorry, das erschließt sich mir aktuell nicht, evtl. Begriffsstutzig.
Ich bin dabei ein Projektmanager zuschreiben, welcher alle Datein auflistet, welche in einem Ordner sind, und dort dann möglichkeiten bietet die text-Datei zu bearbeiten, zum Beispiel einen Eintrag mit Zeitstempel einzufügen, die Datein zu durch suchen und die Suchergebnisse dann unteranderem Hervorzuheben,...
Dafür ist RichEdit das ungeeignete Control. Besser z.B. Treeview, ListBox, Listview.
So bietet z.B. die ListBox mit der GuiListBox.au3 Funktionen, die dein Projekt erfordert.
weil du sie nicht direkt öffnest. Das kam vielleicht falsch rüber:
Es gibt einen Ordner der zu speichern von verschieden Text datein verwendet wird. In den Textdateien kann man sich organisieren, und den Stand von verschiedenen Projekten reinschreiben. Damit man einen Ort hat an welchem alles steht. Da man ja aber auch immer wieder die verschiedesten Datein hat, welche für das Projekt relevant sind, sollen diese auch dort verknüpft werden können. Damit man diese schneller findet und am besten auch direkt öffnen kann.
Hört sich für mich nach einer 1A Geschichte an, um diese Informationen in eine Ini-Datei (1 je Projekt) zu schreiben (z.B. vom Projektleiter) und diese dann zentral im Netzwerk abzulegen.
Das Programm des Nutzers liest diese vom Netzwerkpfad alle vorhandenen Ini's ein und bietet dann die Möglichkeit die Dateien zu öffnen.
Idealerweise generiert es entweder eine Strucktur via Treeview/Listview/Listbox wie von BugFix vorgeschlagen oder auch ein TAB je Projekt mit den entsprechenden Informationen komplett separiert.
Mir erscheint dein aktueller Weg zu umständlich.
weil du sie nicht direkt öffnest. Das kam vielleicht falsch rüber:
Es gibt einen Ordner der zu speichern von verschieden Text datein verwendet wird. In den Textdateien kann man sich organisieren, und den Stand von verschiedenen Projekten reinschreiben. Damit man einen Ort hat an welchem alles steht. Da man ja aber auch immer wieder die verschiedesten Datein hat, welche für das Projekt relevant sind, sollen diese auch dort verknüpft werden können. Damit man diese schneller findet und am besten auch direkt öffnen kann.
Sieht so aus, als wolltest du Git neu erfinden.
Nehmt dann lieber das Original.
Es funktioniert schon alles so wie ich das möchte, nur was mir eben fehlt, ist das man Datein rin ein Richtextedit zeihen kann und diese dann per klick/doppel klick öffnen kann.
Weiß jemand wie man das am besten anstellen kann?
Ich sags nochmal und dann bin ich raus:
Falsches Control.
Ich bin weiterhin der Meinung das dein Weg, den du gehen willst, nicht wirklich Sinn ergibt aber ich werfe zusätzlich zu dem Hinweis von BugFix noch folgendes in den Raum:
Hallo noch mal, ich habe nun die Lösung gefunden, welche nicht wirklich aufwendig ist, wenn man weiß, was alles zu tun ist. Die Lösung hab ich hier gefunden:
Ich hab das skript von ihn abgeändert zu:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <GuiEdit.au3>
#include <GuiRichEdit.au3>
#include <WinAPISys.au3>
#include <Array.au3>
Global Const $ES_NOOLEDRAGDROP = 0x08
Global Const $tagDROPFILES = $tagNMHDR & ";handle hDrop;long cp;bool fProtected"
$gui = GUICreate("test", 600, 400, -1, 100)
$hRichEdit = _GUICtrlRichEdit_Create($gui, "", 10, 10, 580, 380, BitOr($ES_NOOLEDRAGDROP, $ES_MULTILINE, $ES_WANTRETURN, $WS_VSCROLL, $ES_AUTOVSCROLL))
_GUICtrlRichEdit_AutoDetectURL($hRichEdit, True)
_WinAPI_DragAcceptFiles ($hRichEdit)
_GUICtrlRichEdit_SetEventMask($hRichEdit, $ENM_DROPFILES)
GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")
GUISetState()
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
EndSwitch
WEnd
Func WM_NOTIFY($hWnd, $iMsg, $wParam, $lParam)
#forceref $iMsg, $wParam
Local $hWndFrom, $iCode, $tNMHDR, $tDropFiles, $hDrop, $aFileList
$tNMHDR = DllStructCreate($tagNMHDR, $lParam)
$hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
$iCode = DllStructGetData($tNMHDR, "Code")
Switch $hWndFrom
Case $hRichEdit
Switch $iCode
Case $EN_DROPFILES
;Droped File Names extrahieren
$tDropFiles = DllStructCreate($tagDROPFILES, $lParam)
$hDrop = DllStructGetData($tDropFiles, "hDrop")
$aFileList = _WinAPI_DragQueryFileEx($hDrop, 0)
$sFileString = " File:" & _ArrayToString($aFileList, @CRLF & " File:", 1) & " "
Local $iCharPos = _GUICtrlRichEdit_GetCharPosFromXY($hWndFrom, _WinAPI_GetMousePosX(True, $hWndFrom), _WinAPI_GetMousePosY(True, $hWndFrom))
_GUICtrlRichEdit_SetSel($hWndFrom, $iCharPos, $iCharPos)
_GUICtrlRichEdit_InsertText($hWndFrom, $sFileString)
Return 1
EndSwitch
EndSwitch
Return $GUI_RUNDEFMSG
EndFunc ;==>WM_NOTIFY
Func _NewFile($newfile)
$filetxt = FileRead($newfile)
_GUICtrlRichEdit_SetText($hRichEdit, "")
_GUICtrlRichEdit_AppendText($hRichEdit, $filetxt)
_GUICtrlRichEdit_SetSel($hRichEdit, 0, 0)
EndFunc
Alles anzeigen
Wichtig sind die Befehle:
_WinAPI_DragAcceptFiles ($hRichEdit)
_GUICtrlRichEdit_SetEventMask($hRichEdit, $ENM_DROPFILES)
und wichtig ist, dass man in der WM_NOTIFY das ganze abfragt und verarbeitet und anschließend ein Retrun 1 sendet, wenn man nicht möchte, das die Standart Befehle für die Nachricht ausgeführt werden.
und sobald man einmal den Befehl _GUICtrlRichEdit_SetReadOnly verwendet, funktioniert das ganze nicht mehr. Man kann aber mit _GUICtrlRichEdit_SetcharAttributes auf alle Charakter die eigenschaft "pr" setzen und auch wieder in WM_NOTIFY verarbeiten und einfach wenn $EN_Protect kommt Return 1 senden.
Das man draufklicken kann kann man über $EN_Link erreichen.
Moin,
guter Fund. Ich habe mich früher mal mit RichEdits beschäftigt und hätte das auch gern gehabt, habe es aber nicht geschafft. Vielleicht lag es aber auch an Win XP.
Ich habe mit Deiner Lösung gespielt. Offensichtlich ist die GuiRichEdit.au3 schon länger nicht mehr aktualisiert worden. Bereits mit WIn 8 sind viele Optionen hinzugekommen, von denen sich in der UDF nichts findet.
Für die automatische Link-Erkennung gibt es z.B. die Option AURL_ENABLEDRIVELETTERS = 16, die auch normale Dateipfade findet. Die kann man mit _GUICtrlRichEdit_AutoDetectURL() leider nicht nutzen, weil die Funktion für den Parameter intern eine IsBool() Prüfung macht. Außerdem gibt es für die Links die Option SES_HYPERLINKTOOLTIPS = 8, die das Ziel als Tooltipps anzeigt. Das ist zwar eher eine Spielerei, man kann sie aber mit der UDF auch nicht nutzen, weil sowohl die Definition als auch eine Funktion für die Nachricht EM_SETEDITSTYLE fehlen. Auch für die Nachricht EM_SETOPTIONS gibt es keine Funktion. Damit kann man z.B. die Option ECO_SELECTIONBAR = 0x01000000 aktivieren, die an der linken Seite des RichEdit einen Auswahlbereich für Zeilen einrichtet.
Ich habe noch einen weiteren Vorschlag. Für die Einfügeposition kannst DU meiner Meinung nach direkt den Wert cp aus $tagENDROPFILES mutzen. Dann kannst Du auf die Abfrage zu Zeichen- und Mauspositionen verzichten.
Ich habe meine Ideen in das folgende Skript einfliessen lassen. Vielleicht ist da auch etwas für Dich dabei. Wenn Alles funktionieren soll, braucht es aber mindestens Win 8.
#include <GUIConstantsEx.au3>
#include "GuiRichEdit.au3"
#include <MsgBoxConstants.au3>
#include <WinAPISysWin.au3>
#include <WindowsConstants.au3>
; Fehlende Konstanten
Global Const $AURL_ENABLEURL = 1 ; füe $EM_AUTOURLDETECT
Global Const $AURL_ENABLEDRIVELETTERS = 16 ; für $EM_AUTOURLDETECT
Global Const $ECOOP_OR = 2 ; für $EM_SETOPTIONS
Global Const $ECO_SELECTIONBAR = 0x01000000 ; für $EM_SETOPTIONS
Global Const $ES_NOOLEDRAGDROP = 0x08 ; RichEdit Controlstyle
Global Const $SES_HYPERLINKTOOLTIPS = 8 ; für $EM_SETEDITSTYLE
Global Const $tagENDROPFILES = $tagNMHDR & ";handle hDrop;long cp;bool fProtected" ; für $EN_DROPFILES
Global Const $sFile = @ScriptDir & "\Test.rtf"
Global $hGui, $hRichEdit, $idBtnOpen, $idBtnSave
Example()
Func Example()
$hGui = GUICreate("RichEdit", 420, 265, -1, -1, -1, $WS_EX_TOPMOST)
$hRichEdit = _GUICtrlRichEdit_Create($hGui, "", 10, 10, 400, 180, BitOR($ES_NOOLEDRAGDROP, $ES_MULTILINE, $WS_VSCROLL, $ES_AUTOVSCROLL))
$idBtnOpen = GUICtrlCreateButton("Read RTF", 10, 200, 400, 25)
$idBtnSave = GUICtrlCreateButton("Save RTF", 10, 230, 400, 25)
GUISetState(@SW_SHOW)
_WinAPI_DragAcceptFiles($hRichEdit)
_GUICtrlRichEdit_SetEventMask($hRichEdit, $ENM_LINK + $ENM_DROPFILES)
; Fügt auf der linken Seite einen Randbereich für die Auswahl von Zeilen ein.
; Der Stil $ES_SELECTIONBAR (0x01000000) funktioniert hier nicht.
_SendMessage($hRichEdit, $EM_SETOPTIONS, $ECOOP_OR, $ECO_SELECTIONBAR)
; Ermöglicht die Erkennung von normalen Dateipfaden als Link.
; Mit _GUICtrlRichEdit_AutoDetectURL() geht das nicht, weil die Funktion nur boolesche Werte zulässt.
; _GUICtrlRichEdit_AutoDetectURL($hRichEdit, $AURL_ENABLEURL + $AURL_ENABLEDRIVELETTERS)
_SendMessage($hRichEdit, $EM_AUTOURLDETECT, $AURL_ENABLEURL + $AURL_ENABLEDRIVELETTERS)
; Spielerei: Zeigt ToolTips an, wenn die Maus über einem Link steht.
_SendMessage($hRichEdit, $EM_SETEDITSTYLE, $SES_HYPERLINKTOOLTIPS, $SES_HYPERLINKTOOLTIPS)
GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")
While True
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE
_GUICtrlRichEdit_Destroy($hRichEdit)
ExitLoop
Case $idBtnOpen
_GUICtrlRichEdit_StreamFromFile($hRichEdit, $sFile)
If @error Then
MsgBox($MB_TOPMOST + 16, "Error", "Couldn't read the RTF file: " & @error)
EndIf
Case $idBtnSave
_GUICtrlRichEdit_StreamToFile($hRichEdit, $sFile, True)
If @error Then
MsgBox($MB_TOPMOST + 16, "Error", "Couldn't save the RTF file: " & @error)
EndIf
EndSwitch
WEnd
EndFunc ;==>Example
GUIDelete($hGui)
Exit
Func WM_NOTIFY($hWnd, $iMsg, $wParam, $lParam)
Local $aDropped, $hWndFrom, $sDropped, $sUrl, $tENDROPFILES, $tENLINK, $tNMHDR
$tNMHDR = DllStructCreate($tagNMHDR, $lParam)
$hWndFrom = $tNMHDR.hWndFrom
If $hWndFrom = $hRichEdit Then
Switch $tNMHDR.Code
Case $EN_LINK
$tENLINK = DllStructCreate($tagENLINK, $lParam)
If $tENLINK.msg = $WM_LBUTTONDBLCLK Then
$sUrl = _GUICtrlRichEdit_GetTextInRange($hRichEdit, $tENLINK.cpMin, $tENLINK.cpMax)
ConsoleWrite("EN_LINK -> Doppelklick: " & $sUrl & @CRLF)
EndIf
Case $EN_DROPFILES
$tENDROPFILES = DllStructCreate($tagENDROPFILES, $lParam)
$aDropped = _WinAPI_DragQueryFileEx($tENDROPFILES.hDrop, 1)
If @error Then
MsgBox($MB_TOPMOST + 16, "Error!", "_WinAPI_DragQueryFileEx: " & @error)
Else
$sDropped = @CRLF
For $I = 1 To $aDropped[0]
$sDropped &= " " & $aDropped[$I] & @CRLF & @CRLF
Next
_GUICtrlRichEdit_SetSel($hWndFrom, $tENDROPFILES.cp, $tENDROPFILES.cp)
_GUICtrlRichEdit_InsertText($hWndFrom, $sDropped)
Return 1
EndIf
EndSwitch
EndIf
Return $GUI_RUNDEFMSG
EndFunc
Alles anzeigen
Viel Spaß noch!
Freut mich, immer wieder gern!