![]() |
Verzeichniss kopieren, aber "Abbrechen" deaktivier
Zum kopieren eines kompletten Ordners verwende ich eine Funktion von den Schweizern (leicht abgewandelt):
Delphi-Quellcode:
Das Problem an der Sache ist der [Abbrechen] und der [X]-Button. Was kann man tun, dass der Dialog zwar angezeigt wird, aber ein Abbrechen nicht möglich ist?
function CopyDir(const fromDir, toDir: string): Boolean;
var fos: TSHFileOpStruct; begin ZeroMemory(@fos, SizeOf(fos)); with fos do begin wFunc := FO_COPY; fFlags := FOF_NOERRORUI + FOF_SIMPLEPROGRESS + FOF_NOCONFIRMATION + FOF_NOCONFIRMMKDIR; pFrom := PChar(fromDir + #0); pTo := PChar(toDir) end; Result := (0 = ShFileOperation(fos)); end; |
Re: Verzeichniss kopieren, aber "Abbrechen" deakti
Ich glaub dann wird dir nichts anderes übrig bleiben als selbst einen Dialog zu schreiben. Aber wo ist der Sinn einen Standard-Dialog anzuzeigen der sich nicht wie ein Standarddialog benimmt?
|
Re: Verzeichniss kopieren, aber "Abbrechen" deakti
Schau mal hier:
![]() Da kann man zwar ne Menge einstellen (hab's nur flüchtig überflogen), aber ob da das mit dem Abbrechen dabei ist? :gruebel: |
Re: Verzeichniss kopieren, aber "Abbrechen" deakti
Zitat:
Wenn ich das so in Delphi nachbauen wollte wird das ein viel größerer Aufwand, zumal der Dialog aus der genannten Funktion auch automatisch in der Sprache des installieren Windows erscheint. Vielleicht könnte ich ja kurz vorher einen Thread starten, der nach dem Fenster sucht und den button deaktiviert? |
Re: Verzeichniss kopieren, aber "Abbrechen" deakti
Zitat:
|
Re: Verzeichniss kopieren, aber "Abbrechen" deakti
Moin FriFra,
die Flags sind vom Typ FILEOP_FLAGS der wiederum vom Typ WORD ist, also 16-Bit. Es sind, ohne FOF_NO_UI, 16 Flags deklariert worden, so dass also alle Bits aufgebraucht wurden. Daraus schliesse ich, dass es sich bei FOF_NO_UI um eine Kombination von anderen Flags handeln muss. Da bleibt dann wohl, wenn man nicht weiss um welche Kombination es sich handelt, alle Flags die in irgendeiner Form mit der Anzeige zu tun haben, zu kombinieren, und es auszuprobieren, welche das wohl sein könnte. :? |
Re: Verzeichniss kopieren, aber "Abbrechen" deakti
In der ShellAPI.h vom visualStudio 2003 hab ich das hier gefunden:
Code:
da gibts den Parameter auch nicht...
////
//// Shell File Operations //// #ifndef FO_MOVE //these need to be kept in sync with the ones in shlobj.h #define FO_MOVE 0x0001 #define FO_COPY 0x0002 #define FO_DELETE 0x0003 #define FO_RENAME 0x0004 #define FOF_MULTIDESTFILES 0x0001 #define FOF_CONFIRMMOUSE 0x0002 #define FOF_SILENT 0x0004 // don't create progress/report #define FOF_RENAMEONCOLLISION 0x0008 #define FOF_NOCONFIRMATION 0x0010 // Don't prompt the user. #define FOF_WANTMAPPINGHANDLE 0x0020 // Fill in SHFILEOPSTRUCT.hNameMappings // Must be freed using SHFreeNameMappings #define FOF_ALLOWUNDO 0x0040 #define FOF_FILESONLY 0x0080 // on *.*, do only files #define FOF_SIMPLEPROGRESS 0x0100 // means don't show names of files #define FOF_NOCONFIRMMKDIR 0x0200 // don't confirm making any needed dirs #define FOF_NOERRORUI 0x0400 // don't put up error UI #define FOF_NOCOPYSECURITYATTRIBS 0x0800 // dont copy NT file Security Attributes #define FOF_NORECURSION 0x1000 // don't recurse into directories. #if (_WIN32_IE >= 0x0500) #define FOF_NO_CONNECTED_ELEMENTS 0x2000 // don't operate on connected elements. #define FOF_WANTNUKEWARNING 0x4000 // during delete operation, warn if nuking instead of recycling (partially overrides FOF_NOCONFIRMATION) #endif // (_WIN32_IE >= 0x500) #if (_WIN32_WINNT >= 0x0501) #define FOF_NORECURSEREPARSE 0x8000 // treat reparse points as objects, not containers #endif // (_WIN32_WINNT >= 0x501) |
Re: Verzeichniss kopieren, aber "Abbrechen" deakti
Ich habe es jetzt mit einem Thread gelöst ;)
Aufruf:
Delphi-Quellcode:
...
ThreadRunning := True; AppExiting := False; TFindWnd.Create(False); CopyDir(DataDir + '*', 'C:\Test'); AppExiting := True; while ThreadRunning = True do Application.ProcessMessages; ... Thread:
Delphi-Quellcode:
unit thread_FindWnd;
interface uses Classes, SysUtils, Windows, frm_Copydata; type TFindWnd = class(TThread) private { Private-Deklarationen } procedure GetState; procedure Done; protected procedure Execute; override; end; var AppExiting: boolean; implementation { Wichtig: Methoden und Eigenschaften von Objekten in visuellen Komponenten dürfen nur in einer Methode namens Synchronize aufgerufen werden, z.B. Synchronize(UpdateCaption); und UpdateCaption könnte folgendermaßen aussehen: procedure WebUpdate.UpdateCaption; begin Form1.Caption := 'Aktualisiert in einem Thread'; end; } { WebUpdate } procedure TFindWnd.GetState; begin AppExiting := frm_CopyData.AppExiting; end; procedure TFindWnd.Done; begin frm_CopyData.ThreadRunning := False; end; procedure TFindWnd.Execute; var wnd: HWND; textlength: Integer; Text: PChar; mycap: string; CText: array[0..255] of char; begin wnd := 0; try while wnd = 0 do begin Synchronize(GetState); if AppExiting then Exit; wnd := windows.GetForegroundWindow; GetClassName(wnd, CText, 255); if StrPas(CText) = '#32770' then begin wnd := FindWindowEx(wnd, 0, 'Button', nil); windows.GetWindowText(wnd, CText, 255); if StrPas(CText) = 'OK' then wnd := 0; if wnd <> 0 then windows.EnableWindow(wnd, False); end else wnd := 0; end; finally Synchronize(Done); end; end; end. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:47 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