28. juli 2010 - 18:39 Der er 8 kommentarer og
1 løsning

Filelistbox EVENT ved Items removal

HEJ,

Langt herfra er vores DATABASE-server med en masse SQL- og "XML"- "snusk".

Vi (os almindelige dødelige) har ikke SQL-adgang (og får det heller ikke - har prøvet at spørge pænt om lov- MEN NAAAJ -), så vi må skrive XML-scripts for at lægge data ind på DATABASE-serveren.

Da den (som sagt ikke er lokal) bliver disse XML-scripts sendt via intra-nettet til et specielt XML- "INPUT-bibliotek" på serveren. DATABase-serveren henter så dette script, behandler det og meddeler brugeren om det er gået godt (eller galt) ved at anbringe en kopi af scriptet i hhv. "DET-GIK-GODT"-biblioteket eller "DET-GIK-GALT" biblioteket. En test på det relevante bibiotek viser så¨resultatet.

Det er relativt nemt at overføre Scriptet programmæssigt (Delphi sender det), men må overvåge resultatet visuelt, da det nogen gange kan tage op til 15 minutter at se resultatet. Når scriptet er UDE (slettet) fra "INPUT-biblioteket" kan jeg så teste hhv. detgikgodt- eller detgikgalt-biblioteket programmæsigt.

Og det her giver mig en ide:

Findes der i en FILELISTBOX et event, som fyrer når et element i denne listbox slettes (eller fjernes) ?

eller kan der kreeres et sådant event ?

(ofte er der kun 1 script (mit script) i input-bib'et. )

(havde ellers tænkt mig noget i stil med følgende:

En timer fyrer en rutine hvert sekund:
Denne rutine tester INPUT-bib på fjernserveren
(Fjern-server.Filelistbox(update); )

og når input-bib er tomt -- check gikgodt- eller gikgalt-bib. osv... )

Men den er UELEGANT og IKKE i Delphi stil.. !

*) (* end of comment *)

END.

KR(istian)
Avatar billede kroning Nybegynder
28. juli 2010 - 19:16 #1
Prøv at kikke på FindFirstChangeNotification og see also derfra.
Avatar billede kroning Nybegynder
28. juli 2010 - 19:17 #2
Jeg har lige testet og med FindFirstChangeNotification får man også besked hvis en fil slettes / oprettes
28. juli 2010 - 20:19 #3
HEJ,

Indledningsvis: 

Jeg har en D-7 enterprise. Jeg har prøvet en FileListbox Onchange event , men den giver ingenting (kan slette og den "er" ganske ligeglad..

Søgte derefter på " FindFirstChangeNotification " som du foreslog men fandt den ikke. Tog HJÆLP (f1) og søgte igen på
" FindFirstChangeNotification ". Igen med negativt resultat.

Gik på nettet og søgte så på " FindFirstChangeNotification " og Delphi 7.

Fandt en komponent med navnet DirWatch, som "lovede" den søgte funktion (= " FindFirstChangeNotification ").

Installerede komponenten og kørte medfølgende DEMO. Skærmen gir et blink og så er det ovre. Der er INGEN fejlmeddelelser overhovedet. Kører heller ikke i baggrunden !

SÅ det her duer ikke for mig SORRY !

END.

KR(istian)
Avatar billede kroning Nybegynder
28. juli 2010 - 20:29 #4
Jeg bruger D7 proff. og her er koden jeg testede med og som virker fint på D7
----------------
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
    WatchHandle : THandle;
  public
    { Public declarations }
  end;

TWatchThread = class(TThread)
  private
    { Private declarations }
        WatchHandle : THandle;
        Besked : string;
    procedure SendBesked;
  protected
    procedure Execute; override;

  public
    constructor Create(aWatchHandle : THandle);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

{ TWatchThread }

constructor TWatchThread.Create(aWatchHandle : THandle);
begin
    inherited Create(False);
    WatchHandle:=aWatchHandle;
    FreeOnTerminate:=true;
end;

procedure TWatchThread.SendBesked;
begin
    Form1.Memo1.Lines.Add(Besked);
end;

procedure TWatchThread.Execute;
var result : integer;
begin
    Besked:='Thread startet';
    Synchronize(SendBesked);

  while not terminated do
  begin
    result:=WaitForSingleObject(WatchHandle,100);
    if result=WAIT_OBJECT_0 then
        begin
        Besked:='Der er sket en ændring';
        Synchronize(SendBesked);
            if not FindNextChangeNotification(WatchHandle) then
      begin
            Besked:='Fejl i FindNextChangeNotification, thread afsluttes';
            Synchronize(SendBesked);
            Terminate;
            end;
        end;
    end;
end;

{ end TWatchThread }

procedure TForm1.Button1Click(Sender: TObject);
var
    lpPathName : string;
begin
    lpPathName:='c:\hk'; // mappen der skal overvåges
    WatchHandle:=FindFirstChangeNotification(PChar(lpPathName),false,FILE_NOTIFY_CHANGE_FILE_NAME);
  if WatchHandle=INVALID_HANDLE_VALUE then
        Memo1.Lines.Add('fejl i FindFirstChangeNotification')
    else
        TWatchThread.Create(WatchHandle);
end;

end.
28. juli 2010 - 20:33 #5
HEJ,

Jeg "Sakser" din kode, tester og melder tilbage...

END.

KR(istian)
28. juli 2010 - 20:49 #6
HEJ

Har netop testet din kode. Den virker også perfekt her.

1) Må jeg tage den med på job i morgen og teste den der ?
2: Må jeg, hvis den kører perfekt kopiere den og "mis-" bruge den som min egen ?

(jeg spørger fordi det (principielt) er dig som har copyright (og copyleft (he he) ?)

Virker den i morgen, send et svar og de 30 point er dine .. !

END.

KR(istian)
Avatar billede kroning Nybegynder
28. juli 2010 - 20:54 #7
Kopier og test bare løs, det har jeg sikkert selv gjort dengang jeg lavede koden.
Avatar billede a_nor Nybegynder
28. juli 2010 - 22:22 #8
Tak for godt spm og Kroning for altid gode svar...

Kristian, åbn Help -> Windows SDK i din D7 for at søge FindFirstChangeNotification funktionen.

mvh
18. september 2010 - 12:31 #9
LUKKER LINK
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester