Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Drag & drop - Simulation

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Windows-spezifische Fragen
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1208
Wohnort: Ruhrpott

BeitragVerfasst am: 25.10.2014, 00:28    Titel: Drag & drop - Simulation Antworten mit Zitat

Hallo allerseits!

Bei dem Versuch, einen Drag & Drop - Vorgang aus einem Programm heraus zu simulieren, komme ich nicht weiter.

Beim Notepad und bei Winamp funktioniert das Programm wunschgemäß, bei Audacity und Firefox passiert gar nichts (außer daß mir PostMessage eine "1" für eine erfolgreiche Ausführung zurückmeldet). Mein eigentliches Ziel ist es, das gleichzeitige Öffnen mehrerer Dateien in einer Audacity - Instanz zu automatisieren. Kann mir jemand weiterhelfen?

Code:
#Include "windows.bi"
#include "win\shellapi.bi"
#Include "win/tlhelp32.bi"

Type DROPFILES
   pFiles As Integer
  pt As POINT
  fNC As BOOL
  fWide As BOOL
  files As ZString*1000
End Type

Dim As DROPFILES Ptr hd
Dim As String audacity, g, editor, firefox, winamp
Dim As ZString * 1000 text
Dim As Integer x, pid
Dim As LPDWORD prozess
Dim As HANDLE snapshothandle
Dim As PROCESSENTRY32 prozessantwort
Dim As HWND fensterhandle

audacity = "C:\Programme\Audio\Audacity203\audacity.exe"
editor = "C:\WINDOWS\system32\notepad.exe"
firefox = "C:\Programme\Internet\Firefox\firefox.exe"
winamp = "C:\Programme\Audio\Winamp\winamp.exe"

'Sleep 5000

g = ""
snapshothandle = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0) 'handle für systemschnappschuß erstellen
prozessantwort.dwSize = SizeOf(prozessantwort) 'größe der datenstruktur für antwort übergeben
Process32First(snapshothandle,@prozessantwort) 'ersten prozesshandle suchen (ist SYSTEM IDLE PROCESS)
Do While Process32Next(snapshothandle, @prozessantwort) 'alle prozesse durchsuchen
   If LCase(prozessantwort.szExeFile) = "winamp.exe" Then
   'If LCase(prozessantwort.szExeFile) = "firefox.exe" Then
   'If LCase(prozessantwort.szExeFile) = "audacity.exe" Then 'prozess gehört zu audacity
   'If LCase(prozessantwort.szExeFile) = "notepad.exe" Then
      g = prozessantwort.szExeFile 'dateiname
      pid = prozessantwort.th32ProcessID 'prozess-ID
      Exit Do 'suche beenden
   EndIf
Loop
CloseHandle(snapshothandle) 'ressourcen freigeben

'fensterhandle aus PID ermittteln
fensterhandle = GetWindow(FindWindow(0,0), GW_HWNDFIRST) 'erstes fensterhandle
Print fensterhandle
Do
   fensterhandle = GetWindow(fensterhandle,GW_HWNDNEXT) 'nächstes fensterhandle
   GetWindowThreadProcessId(fensterhandle, @prozess) 'prozess-ID des fensters ermitteln
   Print fensterhandle;" ";prozess;
   If pid = prozess Then 'fenster gehört zum gesuchten prozess
      GetWindowText(fensterhandle,@text,200) 'fenstertext ermitteln
      Print " ";text
      'If InStr(text,"Editor") Then
      'If InStr(text,"Audacity") Then 'hauptfenster
      'If InStr(text,"Firefox") Then
      If InStr(text,"Winamp 5") Or InStr(text,"- Winamp")Then
         Exit Do 'suche beenden
      EndIf
   Else
      Print
   EndIf
Loop While fensterhandle
Print
Print text 'fenstertext

Print "PID ";pid
Print
Print prozess;" ";fensterhandle
Print

g = "h:\test\Lady in black.wav" + Chr(0,0) 'zu "droppende" datei
'g = "e:\text.txt" + Chr(0,0)

hd = Callocate(20 + Len(g)) 'DROPFILES - struktur anlegen
hd->pFiles = 20 'offset für dateiliste
hd->fNC = 0 'drop - koordinaten sind relativ zum anwendungsfenster
hd->fWide = 0 'dateiliste ist ASCII
hd->pt.x = 200 'drop - koordinaten
hd->pt.y = 200
hd->files = g 'dateiliste

Print DragQueryFile(hd,-1,@text,1000) 'anzahl der files
Print DragQueryFile(hd,0,@text,1000) '1. filename
Print text
DragAcceptFiles(fensterhandle,TRUE)
Print PostMessage(fensterhandle,WM_DROPFILES,hd,0) 'meldung an anwendung senden
'Print SendMessage(fensterhandle,WM_DROPFILES,hd,0) '--> PROGRAMMABSTURZ

DeAllocate hd
Sleep


Gruß
grindstone
_________________
For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
noop



Anmeldungsdatum: 04.05.2005
Beiträge: 259

BeitragVerfasst am: 01.11.2014, 02:37    Titel: Antworten mit Zitat

Hi,

1) Du schreibst, dass du mehrere Dateien gleichzeitig in Audacity öffnen möchtest. Muss Audacity vorher schon laufen?
Falls nicht: Wäre ein simpler Aufruf der Art "audacity.exe datei1.wav datei2.wav" möglich?

2) Ich habe den Code ausprobiert und mit Notepad getestet - funktioniert bei mir allerdings nicht.
Ich habe es daher mal mit Internet "querlesen" folgendermaßen implementiert (keine Ahnung, ob das so wasserdicht dicht ist. Dieses Gebiet ist für mich noch etwas Neuland).
Code:
#define UNICODE
#define GHND &h42
#Include "windows.bi"
#include once "win\shellapi.bi"
#include once "win\Shlobj.bi"
#Include once "win\tlhelp32.bi"

declare sub dropFileOn(hWnd as HWND, filename as string)

Dim As wstring*(MAX_PATH+1) text
dim as DWORD pid
Dim As DWORD prozess
Dim As HANDLE snapshothandle
Dim As PROCESSENTRY32W prozessantwort
Dim As HWND fensterhandle

dim as string exe,wndName,filename
filename = "c:\test1.txt"
exe = "notepad.exe"
wndName = "Notepad"

'exe = "chrome.exe"
'wndName = "Chrome"

'filename = "c:\w1.wav"
'exe = "audacity.exe"
'wndName = "Audacity"

snapshothandle = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0) 'handle für systemschnappschuß erstellen
prozessantwort.dwSize = SizeOf(prozessantwort) 'größe der datenstruktur für antwort übergeben
Process32First(snapshothandle,@prozessantwort) 'ersten prozesshandle suchen (ist SYSTEM IDLE PROCESS)
Do While Process32Next(snapshothandle, @prozessantwort) 'alle prozesse durchsuchen
   If LCase(prozessantwort.szExeFile) = exe Then
      pid = prozessantwort.th32ProcessID 'prozess-ID
      Exit Do 'suche beenden
   EndIf
Loop
CloseHandle(snapshothandle) 'ressourcen freigeben

'fensterhandle aus PID ermittteln
fensterhandle = GetWindow(FindWindow(0,0), GW_HWNDFIRST) 'erstes fensterhandle
Do
   fensterhandle = GetWindow(fensterhandle,GW_HWNDNEXT) 'nächstes fensterhandle
   GetWindowThreadProcessId(fensterhandle, @prozess) 'prozess-ID des fensters ermitteln

   If pid = prozess Then 'fenster gehört zum gesuchten prozess
      GetWindowText(fensterhandle,@text,MAX_PATH) 'fenstertext ermitteln
      If InStr(text,wndName) Then
         Exit Do 'suche beenden
      EndIf
   EndIf
Loop While fensterhandle
Print "PID: ";pid
Print "Fenstertitel: ";text
print "Fensterhandle: ";fensterhandle
Print

dropFileOn(fensterhandle,filename)
sleep

sub dropFileOn(hWnd as HWND, filename as string)
    dim as DROPFILES ptr dfPTR = cast(DROPFILES ptr,globalAlloc(0,sizeof(DROPFILES) + (len(filename)+1)*sizeof(wstring)))
    dfPTR->pFiles = sizeof(DROPFILES) ' offset to start of file list
    dfPTR->fWide = TRUE ' Unicode {TRUE/FALSE}
    *cast(wstring ptr,dfPTR+1) = wstr(filename) 'dfPTR+1 <-> dfPTR+sizeof(DROPFILES) <-> start of file list
    print "PostMessage: ";postMessage(hWnd, WM_DROPFILES, cast(WPARAM,dfPTR), 0)
    print "Letzter Fehler: ";getLastError()
    globalFree(dfPTR)
end sub

Damit klappts bei mir mit Notepad [Beachte: Bei mir heißt das Fenster Notepad und nicht Editor].
SendMessage klappt bei mir auch nicht. Hab das auch öfters auf Foren gelesen, dass das bei denen nur mit PostMessage geklappt hat.
Mit Google Chrome und Audacity klappt es hingegen nicht. Dazu habe ich eine mögliche Erklärung gefunden:
http://microsoft.public.platformsdk.shell.narkive.com/HuJ9fjDN/send-hdrop-data-with-wm-dropfiles-message
Ganz unten, insb. letzter Post:
Zitat:
[...] these applications do not actually handle the WM_DROPFILES message. Instead, they implement IDropTarget and call RegisterDragDrop. Unfortunately, there is currently no documented method of retrieving the IDropTarget interface associated with a window.

Und hier: http://codeverge.com/embarcadero.delphi.nativeapi/how-to-programmiclly-drag-and-dr/1069356
Wieder letzter Post:
Zitat:
The "preferred" way to pass data around is to implement the IDataObject and
IDragSource interfaces in your code. Microsoft wants you to use the Win32
API DoDragDrop() function, however since you want to send data to a specific
window, that will not work as DoDragDrop() is an interactive function that
requires human action to do its work. There is no official way to get an
IDropTarget interface from a specific HWND, but there is an unofficial way
(untested):

{code:delphi}
var
DT: IDropTarget;
begin
DT := IDropTarget(GetProp(hWnd, 'OleDropTargetInterface'));
...
end;
{code}

With that (assuming it works), you can then call the IDropTarget.DragEnter()
method to ask the other app for permission to "drop" your data, and then if
allowed call the IDropTarget.Drop() to do the actual drop.

> procedure DoDropFiles(Wnd: HWND; Files: TStringList);

Vielleicht hilft dir das ja weiter. Solltest du was irgendwie hinkriegen,
poste bitte die Lösung! Bin auch daran interessiert.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1208
Wohnort: Ruhrpott

BeitragVerfasst am: 01.11.2014, 11:01    Titel: Antworten mit Zitat

Hallo noop!

Zitat:
Wäre ein simpler Aufruf der Art "audacity.exe datei1.wav datei2.wav" möglich?
Das wäre schön, aber wenn ich Audacity so aufrufe, habe ich hinterher zwei Instanzen mit jeweils einer Audiodatei.

Vielleicht sollte ich zum näheren Verständnis kurz erläutern, was ich eigentlich vorhabe: Meine Musiksammlung besteht im Wesentlichen aus Radiomitschnitten, und beim Sammeln habe ich drei Gegner: Ansager, Tontechniker und Geisterfahrer. Daher kommt es öfter vor, daß ich -mithilfe von Audacity- aus mehreren kaputtgequatschten oder endlos crossgefadeten Aufnahmen eine intakte mache. Um mir diese Arbeit zu erleichtern, habe ich mir ein Verwaltungsprogramm geschrieben, das -nachdem ich die entsprechenden Dateien ausgewählt habe- zunächst -falls erforderlich- Audacity startet, dann die Dateien in ein Arbeitsverzeichnis kopiert ("H:\test\"), dieses Verzeichnis öffnet und in den Vordergrund holt. Dort kann ich dann die Dateien mit der Maus markieren und auf das Audacity - Fenster ziehen. Diese letzten zwei Arbeitsschritte sind es, die ich auch noch automatisieren möchte.

Soweit ich bis jetzt herausgefunden habe, gibt es beim Drag & Drop zwei Verfahren: Einmal jenes mit DROPFILES, das noch von Windows 3.1 stammt und aus Gründen der Abwärtskompatibilität weiter implementiert ist. Danach hat man sich bei Microsoft gesagt: "Warum einfach, wenn's auch kompliziert geht?" und sich ein zweites Verfahren mit IUnknown, IDropTarget, IDropSource, IDataObjekt und IEnumFormatEtc ausgedacht.

Zu diesem Thema hat stephanbrunker ein sehr schönes Tutorial geschrieben, durch das ich mich gerade durcharbeite.

Gruß
grindstone
_________________
For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
noop



Anmeldungsdatum: 04.05.2005
Beiträge: 259

BeitragVerfasst am: 01.11.2014, 13:07    Titel: Antworten mit Zitat

Das wurde anscheinend geändert. Mit meiner alten Version klappt der Kommandozeilenaufruf. Neuerdings geht es so:
Schreibe in eine Datei *.lof die Zeilen
Code:
window
file "C:\w1.wav"
file "C:\w2.wav"
und öffne die Datei mit audacity per Kommandozeile.
Das klappt auch bei der neuen Version. Siehe dazu auch hier: http://manual.audacityteam.org/o/man/lof_files.html
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1208
Wohnort: Ruhrpott

BeitragVerfasst am: 01.11.2014, 15:01    Titel: Antworten mit Zitat

Danke für den Tip, das hätte auch mit meiner alten Audacity - Version funktioniert - wenn ich es gewußt hätte. Wer lesen kann, ist klar im Vorteil! grinsen Immerhin: Dafür habe ich jetzt die neueste Version installiert.

Einen Haken hat die Sache allerdings: Im Dateinamen dürfen, anders als bei Drag & Drop, keine Umlaute enthalten sein.

Und wirklich praktikabel ist diese Methode für mich auch nicht, denn sie funktioniert nur zusammen mit einem Neustart von Audacity. Ich könnte zwar eine eventuell laufende Instanz von meinem Programm aus beenden, aber das dauert jedesmal 20 - 30 Sekunden zusätzlich, da geht markieren und draufziehen doch schneller.

Da werde ich doch weiter versuchen, Drag & Drop zu simulieren - aber nicht mehr heute, ich habe schon ganz eckige Augen... Ich brauch nen Kaffee...

Gruß
grindstone
_________________
For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Jojo
alter Rang


Anmeldungsdatum: 12.02.2005
Beiträge: 9736
Wohnort: Neben der Festplatte

BeitragVerfasst am: 01.11.2014, 19:19    Titel: Antworten mit Zitat

grindstone hat Folgendes geschrieben:
Einen Haken hat die Sache allerdings: Im Dateinamen dürfen, anders als bei Drag & Drop, keine Umlaute enthalten sein.

Oder sie müssen einfach im richtigen Encoding sein. Ich nehme stark an, dass Audacity eine UTF-8-Strings in der Datei erwartet, während FreeBASIC typischerweise mit Steinzeit-ANSI-Strings arbeitet. Eine Kombination von MultiByteToWideChar und WideCharToMultiByte aus der WinAPI kann dir helfen, zwischen ANSI und UTF-8 zu konvertieren.
_________________
» Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1208
Wohnort: Ruhrpott

BeitragVerfasst am: 02.11.2014, 19:10    Titel: Antworten mit Zitat

Ja, sowas in der Art vermute ich auch. Aber wie gesagt, die Methode mit dem .lof - File ist für mich sowieso nicht praktikabel, und zum nur-mal-kurz-ausprobieren ist mir die Parameterliste der API-Funktionen zu umfangreich. Aber gut zu wissen, daß es sie gibt lächeln

Ich habe mein Problem inzwischen auf andere Weise gelöst, und zwar mithilfe von SendInput. Damit lassen sich Tastatureingaben, Mausaktionen und Hardwareeingaben simulieren.
Code:
#Include "windows.bi"
#Include "win\tlhelp32.bi"

Declare Sub TastenSim(taste As UByte, ut As String = "")

Type IINPUT
   itype As Integer
   Union
      mi As MOUSEINPUT
      ki As KEYBDINPUT   
      hi As HARDWAREINPUT
   End Union
End Type

Dim As String g, f
Dim As Integer x, y
Dim As Short kc
Dim As UByte b
ReDim As String datei(1)

Sleep 5000

ReDim datei(2)
datei(1) = "Lady in black.mp3"
datei(2) = "Da sprach der alte Häuptling der Indianer.wav"

TastenSim(Asc("D"),"alt") 'datei-menü öffnen
TastenSim(Asc("I")) 'importieren
TastenSim(Asc("A")) 'audio
For x = 1 To UBound(datei) 'dateinamen übermitteln
   If x > 1 Then
      TastenSim(Asc(" ")) 'space als trennzeichen
   EndIf
   TastenSim(Asc("2"),"shift") 'anführungszeichen
   For y = 1 To Len(datei(x)) 'dateinamen
      'Sleep 200
      g = Mid(datei(x),y,1)
      kc = VkKeyScan(g[0]) 'in scancodes umwandeln
      Select Case HiByte(kc) 'umschalttasten
         Case 1
            f = "shift"
         Case 2
            f = "ctrl"
         Case 6
            f = "altgr"
         Case Else
            f = ""
      End Select
      TastenSim(LoByte(kc),f) 'tastendruck simulieren
   Next
   TastenSim(Asc("2"),"shift") 'anführungszeichen
Next
TastenSim(VK_RETURN) 'enter

Sub TastenSim(taste As UByte, ut As String = "")
   Dim As IINPUT ip
   
   ip.itype = INPUT_KEYBOARD
   With ip.ki
      .wScan = 0
      
      If ut <> "" Then
         .dwFlags = 0
         Select Case ut 'umschalttaste drücken
            Case "shift"
               .wVk = VK_SHIFT
            Case "alt"
               .wVk = VK_MENU
            Case "altgr"
               .wVk = VK_RMENU
            Case "ctrl"
               .wVk = VK_CONTROL
         End Select
         SendInput(1,Cast(LPINPUT,@ip),SizeOf(ip))
      EndIf
            
      .dwFlags = 0
      .wVk = taste
      SendInput(1,Cast(LPINPUT,@ip),SizeOf(ip))   'taste drücken
      .dwFlags = KEYEVENTF_KEYUP
      SendInput(1,Cast(LPINPUT,@ip),SizeOf(ip))   'taste loslassen
      
      If ut <> "" Then
         .dwFlags = KEYEVENTF_KEYUP
         Select Case ut 'umschalttaste loslassen
            Case "shift"
               .wVk = VK_SHIFT
            Case "alt"
               .wVk = VK_MENU
            Case "altgr"
               .wVk = VK_RMENU
            Case "ctrl"
               .wVk = VK_CONTROL
         End Select
         SendInput(1,Cast(LPINPUT,@ip),SizeOf(ip))
      EndIf
            
   End With

End Sub

Damit das Beispiel funktioniert, muß Audacity laufen und im Vordergrund sein (darum die 5 Sekunden Pause). Außerdem muß der Importpfad von Audacity auf das Verzeichnis mit den Audiodateien zeigen. Dazu reicht es, einmal eine Audiodatei aus dem betreffenden Verzeichnis zu importieren.

Auch für simulierte Mausaktionen habe ich ein kleines Beispiel geschrieben:
Code:
#Include "windows.bi"

Type IINPUT
   itype As Integer
   Union
      mi As MOUSEINPUT
      ki As KEYBDINPUT   
      hi As HARDWAREINPUT
   End Union
End Type

Dim As Integer x
Dim As IINPUT ip

ip.itype = INPUT_MOUSE
With ip.mi
   .mouseData = 1
   .dwFlags = MOUSEEVENTF_ABSOLUTE Or MOUSEEVENTF_MOVE
   For x = 1 To 5
      .dx = 10000
      .dy = 10000
      SendInput(1,Cast(LPINPUT,@ip),SizeOf(ip))
      Sleep 1000
      .dx = 30000
      .dy = 30000
      SendInput(1,Cast(LPINPUT,@ip),SizeOf(ip))
      Sleep 1000
   Next
End With

Mit entsprechendem Aufwand ließe sich damit durchaus ein Drag & Drop - Vorgang realisieren.

Nebenbei hätte SendInput auch das Potential zum Mobbingwerkzeug, um Arbeitskollegen und andere computerbenutzende Mitmenschen in den Wahnsinn zu treiben. zwinkern

Gruß
grindstone
_________________
For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Jojo
alter Rang


Anmeldungsdatum: 12.02.2005
Beiträge: 9736
Wohnort: Neben der Festplatte

BeitragVerfasst am: 02.11.2014, 21:18    Titel: Antworten mit Zitat

grindstone hat Folgendes geschrieben:
Nebenbei hätte SendInput auch das Potential zum Mobbingwerkzeug, um Arbeitskollegen und andere computerbenutzende Mitmenschen in den Wahnsinn zu treiben. zwinkern

Hilfe, die 90er sind zurück und wollen ihre Scherzprogramme wieder haben. Zunge rausstrecken
_________________
» Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1208
Wohnort: Ruhrpott

BeitragVerfasst am: 03.11.2014, 02:09    Titel: Antworten mit Zitat

Du meinst, wir sind schon zu alt für sowas? traurig

Gruß
grindstone
_________________
For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1208
Wohnort: Ruhrpott

BeitragVerfasst am: 03.11.2014, 23:20    Titel: Antworten mit Zitat

Geschafft! happy

Nach dem o.a. Workaround hier nun eine "echte" Drag & Drop - Simulation.

Gruß
grindstone
_________________
For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
VANYA



Anmeldungsdatum: 17.06.2011
Beiträge: 8

BeitragVerfasst am: 18.07.2017, 11:44    Titel: Antworten mit Zitat

Hallo an alle!

Zitat:
Zu diesem Thema hat stephanbrunker ein sehr schönes Tutorial geschrieben, durch das ich mich gerade durcharbeite.


Mein Programm stürzt ab, wenn Sie von das Dialogfeld im Explorer-Fenster ziehen. Ich wollte in die Angelegenheit prüfen, aber ich denke, es ist nicht der Fall, wenn das endgültige Ergebnis nicht zufriedenstellend Programm. Während selbst ausführbare die vom Autor selbst erstellte auch nicht funktioniert.

Vielleicht ist der Autor von Lektionen wird diese Nachricht sehen und sieht, dass der Code falsch ist.

DragDrop5.zip
_________________
http://free-basic.ru/ - Russian FreeBasic site
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1208
Wohnort: Ruhrpott

BeitragVerfasst am: 21.07.2017, 12:58    Titel: Antworten mit Zitat

Hallo VANYA!

Deine Anfrage geht wohl an stephanbrunker als Autor des Tutorials, aber der scheint sich inzwischen vom deutschen FreeBasic - Forum verabschiedet zu haben.

Und ich kann dir leider auch nicht weiterhelfen traurig .

Gruß
grindstone
_________________
For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
VANYA



Anmeldungsdatum: 17.06.2011
Beiträge: 8

BeitragVerfasst am: 22.07.2017, 17:16    Titel: Antworten mit Zitat

Hallo grindstone!

Ich wird versuchen, zu verstehen. Ich muss sagen, dass der Code ist sehr schwierig. Danke für die Antwort in diesem Thema.
_________________
http://free-basic.ru/ - Russian FreeBasic site
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
stephanbrunker



Anmeldungsdatum: 06.08.2017
Beiträge: 2

BeitragVerfasst am: 06.08.2017, 09:28    Titel: Antworten mit Zitat

Hallo,

ich war hier noch nie aktiv, außerdem programmiere ich nur ein paar mal im Jahr was. Ich bekomme zwar so einmal im Jahr eine email mit irgendwelchen Fragen (zuletzt ein Bugfix in der BigInteger) und da kümmere ich mich schon drum. Da das hier mein Klarname ist kann man den auch googeln. Ich dachte zwar das meine email-Adresse beim freebasic-portal.de einsehbar ist, aber das habe ich nie nachgesehen.

Der Drag&Drop Code hat funktioniert als ich ihn geschrieben habe. Wie das aber immer so ist, hat sich seitdem der Compiler verändert und die Windows-Version auch und deshalb ist das alles nicht von Dauer.

Ich habe die Beispielprogramme aus dem Tutorial durchprobiert und bis Dragdrop4 funktionieren sie alle - das Prinzip funktioniert also. Nr. 5 weitet Nr. 4 nur auf andere Formate aus, da muss irgendwo noch ein Fehler drin sein.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
stephanbrunker



Anmeldungsdatum: 06.08.2017
Beiträge: 2

BeitragVerfasst am: 06.08.2017, 10:35    Titel: Antworten mit Zitat

Jetzt funktioniert es wieder. Das war der Bug, den ich auf Seite 3 des Tutorials auch erwähnt hatte. IDropSource:QueryInterface hatte in der DragDrop5 noch die Deklaration "iid as IID Ptr" drin, während es in allen anderen Versionen der DragDropSource schon auf "iid as REFIID" geändert war. Da Drag in allen vorherigen Steps funktioniert hat, musste man nur mit WinMerge die Steps vergleichen um den Fehler zu sehen. Ich gehe aber jetzt hin und gleiche alle Steps untereinander mit WinMerge nochmal an, damit da wirklich nur die Unterschiede auftauchen. Das macht dann auch deutlicher, wie die Steps aufeinander aufbauen. Ich war da zwar ziemlich, aber nicht zu 100% konsequent, da ich das Tutorial als Abfallprodukt zu einem eigenen Projekt geschrieben habe.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
VANYA



Anmeldungsdatum: 17.06.2011
Beiträge: 8

BeitragVerfasst am: 08.08.2017, 05:14    Titel: Antworten mit Zitat

stephanbrunker hat Folgendes geschrieben:
Jetzt funktioniert es wieder. Das war der Bug, den ich auf Seite 3 des Tutorials auch erwähnt hatte. IDropSource:QueryInterface hatte in der DragDrop5 noch die Deklaration "iid as IID Ptr" drin, während es in allen anderen Versionen der DragDropSource schon auf "iid as REFIID" geändert war. Da Drag in allen vorherigen Steps funktioniert hat, musste man nur mit WinMerge die Steps vergleichen um den Fehler zu sehen. Ich gehe aber jetzt hin und gleiche alle Steps untereinander mit WinMerge nochmal an, damit da wirklich nur die Unterschiede auftauchen. Das macht dann auch deutlicher, wie die Steps aufeinander aufbauen. Ich war da zwar ziemlich, aber nicht zu 100% konsequent, da ich das Tutorial als Abfallprodukt zu einem eigenen Projekt geschrieben habe.


Hallo stephanbrunker!

Vielen Dank für Ihre Bemühungen! Nun, wenn es funktioniert, kann ich zum Lesen des Lehrbuches vorgehen. Und obwohl ich nicht weiß, an allen deutschen, ich denke, mit Hilfe von Google kann ich verstehen.
_________________
http://free-basic.ru/ - Russian FreeBasic site
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Windows-spezifische Fragen Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.

 Impressum :: Datenschutz