AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Verzeichniss kopieren, aber "Abbrechen" deaktivieren...
Thema durchsuchen
Ansicht
Themen-Optionen

Verzeichniss kopieren, aber "Abbrechen" deaktivieren...

Ein Thema von FriFra · begonnen am 12. Dez 2006 · letzter Beitrag vom 13. Dez 2006
Antwort Antwort
Benutzerbild von FriFra
FriFra

Registriert seit: 19. Apr 2003
1.291 Beiträge
 
Delphi 2005 Professional
 
#1

Verzeichniss kopieren, aber "Abbrechen" deaktivier

  Alt 12. Dez 2006, 22:28
Zum kopieren eines kompletten Ordners verwende ich eine Funktion von den Schweizern (leicht abgewandelt):
Delphi-Quellcode:
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;
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?
Elektronische Bauelemente funktionieren mit Rauch. Kommt der Rauch raus, geht das Bauteil nicht mehr.
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#2

Re: Verzeichniss kopieren, aber "Abbrechen" deakti

  Alt 12. Dez 2006, 22:31
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?
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von Martin K
Martin K

Registriert seit: 20. Okt 2005
919 Beiträge
 
Turbo Delphi für Win32
 
#3

Re: Verzeichniss kopieren, aber "Abbrechen" deakti

  Alt 12. Dez 2006, 22:40
Schau mal hier:
http://msdn.microsoft.com/library/de...leopstruct.asp
Da kann man zwar ne Menge einstellen (hab's nur flüchtig überflogen), aber ob da das mit dem Abbrechen dabei ist?
Mit den Menschen ist es wie mit Computern -
es gibt Nullen und Einsen.
  Mit Zitat antworten Zitat
Benutzerbild von FriFra
FriFra

Registriert seit: 19. Apr 2003
1.291 Beiträge
 
Delphi 2005 Professional
 
#4

Re: Verzeichniss kopieren, aber "Abbrechen" deakti

  Alt 12. Dez 2006, 22:41
Zitat von SirThornberry:
Aber wo ist der Sinn einen Standard-Dialog anzuzeigen der sich nicht wie ein Standarddialog benimmt?
Wieso, er benimmt sich doch wie ein Standart dialog ... der User soll ihn dabei nur nicht unterbrechen können... Diese API funzt nunmal sehr zuverlässig und mit wenig Aufwand zu implementieren.

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?
Elektronische Bauelemente funktionieren mit Rauch. Kommt der Rauch raus, geht das Bauteil nicht mehr.
  Mit Zitat antworten Zitat
Benutzerbild von FriFra
FriFra

Registriert seit: 19. Apr 2003
1.291 Beiträge
 
Delphi 2005 Professional
 
#5

Re: Verzeichniss kopieren, aber "Abbrechen" deakti

  Alt 12. Dez 2006, 22:46
Zitat von Martin K:
Schau mal hier:
http://msdn.microsoft.com/library/de...leopstruct.asp
Da kann man zwar ne Menge einstellen (hab's nur flüchtig überflogen), aber ob da das mit dem Abbrechen dabei ist?
Da gibt es einen Parameter FOF_NO_UI (no user input?), der schaut recht vielversprechend aus, nur ist diese Konstante nicht in der ShellAPI definiert. auch die msdn und google helfen mir da nicht weiter...
Elektronische Bauelemente funktionieren mit Rauch. Kommt der Rauch raus, geht das Bauteil nicht mehr.
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.116 Beiträge
 
Delphi 11 Alexandria
 
#6

Re: Verzeichniss kopieren, aber "Abbrechen" deakti

  Alt 12. Dez 2006, 23:06
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.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Benutzerbild von FriFra
FriFra

Registriert seit: 19. Apr 2003
1.291 Beiträge
 
Delphi 2005 Professional
 
#7

Re: Verzeichniss kopieren, aber "Abbrechen" deakti

  Alt 12. Dez 2006, 23:21
In der ShellAPI.h vom visualStudio 2003 hab ich das hier gefunden:
Code:
////
//// 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)
da gibts den Parameter auch nicht...
Elektronische Bauelemente funktionieren mit Rauch. Kommt der Rauch raus, geht das Bauteil nicht mehr.
  Mit Zitat antworten Zitat
Benutzerbild von FriFra
FriFra

Registriert seit: 19. Apr 2003
1.291 Beiträge
 
Delphi 2005 Professional
 
#8

Re: Verzeichniss kopieren, aber "Abbrechen" deakti

  Alt 13. Dez 2006, 01:25
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) = '#32770then
      begin
        wnd := FindWindowEx(wnd, 0, 'Button', nil);
        windows.GetWindowText(wnd, CText, 255);
        if StrPas(CText) = 'OKthen
          wnd := 0;
        if wnd <> 0 then
          windows.EnableWindow(wnd, False);
      end
      else
        wnd := 0;
    end;
  finally
    Synchronize(Done);
  end;
end;

end.
Elektronische Bauelemente funktionieren mit Rauch. Kommt der Rauch raus, geht das Bauteil nicht mehr.
  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 16:35 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