Results 1 to 14 of 14

Thread: Database up- en downloaden

  1. #1
    Yep, hij doet het ... !! Ik leer wel snel van jullie hoor !! BEDANKT !!

    Gelijk maar even mijn volgende vraag stellen..

    Hoe kan ik een ander programma, een database laten updaten via het internet ?? Ik heb dus een klein subprogrammatje gemaakt, en die wil ik met een druk op een knop mijn database laten updaten. In dit subprogrammatje moet ook een TProgressBar voorkomen, zodat je kan zien hoever hij is.. Hoe kan ik dit het beste aanpakken ??

  2. #2
    Kijk eens naar deze thread
    Marcel

  3. #3
    Dat is denk ik niet helemaal wat ik bedoel. Ik ben op internet even opzoek gegaan. Ik denk dat dit er meer mee te maken hebt, maar kan iemand mij meer uitleg geven over deze code ??

    Code:
    TIP 517
    Mijn programma gebruikt diverse databestanden. Deze worden regelmatig ge-update. Mijn 
    programma dient hiertoe verbinding te maken met een server op afstand (via internet), 
    te controleren op ge-update bestanden en indien deze er zijn deze te downloaden naar de 
    machine van de gebruiker (een beetje zoals McAfee VirusScan zijn .DAT bestanden update). 
    Kunt u me tips en/of voorbeelden hiertoe geven? Hoe maak ik zo'n zelf-updatend programma?
    
    
    
    uses URLMon;
    
    function DownloadFile(Source, Dest: string): Boolean;
    begin
      try
        Result := UrlDownloadToFile(nil, PChar(source),
                   PChar(Dest), 0, nil) = 0;
      except
        Result := False;
      end;
    end;
    
    //Voorbeeld / Example:
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      if DownloadFile('http://www.delphi3000.com/index.htm,
                      'c:\index.htm')
    then
       ShowMessage('Download succesful')
      else
       ShowMessage('Download unsuccesful')
    end;

  4. #4
    Als je je database als bestand wilt up- en downloaden kun je dat het bestie via FTP doen. De Indy components zijn hier perfect voor.
    Marcel

  5. #5
    Om wat meer overzicht te houden heb ik dit gedeelte even losgekoppeld van de orginele thread.
    Marcel

  6. #6
    Bedankt Marcel,

    Inderdaad iets overzichtelijker..

    Het moet namelijk zo zijn dat je met druk op de knop een databasebestand kan downloaden, en dat direct in de goede directory wordt gezet. Kan dat ook met een Indy component ?

    Kan iemand mij verder nog wat informatie geven over deze code ??:

    Code:
    uses URLMon;
    
    function DownloadFile(Source, Dest: string): Boolean;
    begin
      try
        Result := UrlDownloadToFile(nil, PChar(source),
                   PChar(Dest), 0, nil) = 0;
      except
        Result := False;
      end;
    end;
    
    //Voorbeeld / Example:
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      if DownloadFile('http://www.delphi3000.com/index.htm,
                      'c:\index.htm')
    then
       ShowMessage('Download succesful')
      else
       ShowMessage('Download unsuccesful')
    end;

  7. #7
    Met deze code zou je inderdaad je database kunnen downloaden, uploaden zul je met een FTP component moeten doen. Je zult denk ik dan ook je site tijdelijk down moeten brengen om te voorkomen dat het bestand in gebruik is.
    Marcel

  8. #8
    Het uploaden van mijn database is niet nodig.. Het gaat alleen om het downloaden.. Ik heb me laten vertellen dat dat middels bovenstaande code met 1 druk op de knop kan.. Als ik deze code alleen zo overneem, krijg ik een aantal foutmeldingen.. nl,

    Deze zin komt in het rood te staan, met de fouten:

    if DownloadFile('http://www.call4free.nl/index.htm,

    [Error] Update.pas(45): Unterminated string
    [Error] Update.pas(46): Missing operator or semicolon
    [Error] Update.pas(46): Not enough actual parameters

    Kan iemand mij hier de oplossing van geven ??

  9. #9
    Old Navigator Matthijs's Avatar
    Join Date
    Mar 2001
    Location
    Ede, NL. Delphi: Delphi 7/2005 :). Matthijs schrijf je Matthijs
    Posts
    2,199
    Unterminated string. Betekent dat je een string hebt die niet is afgesloten. Je moet er aan denken dat de compiler geen strings aankan die over meerdere regels staan.
    Zet dus tussen de m en de komma een quote en de boel zou beter moeten zijn!
    Code:
    if DownloadFile('http://www.call4free.nl/index.htm',
    What's in a sig?

    Would my posting be less valuable if it didnot have a sig? (Vrij naar William S.)

    Let op de kleine lettertjes. For all postings: e&oe!
    This program performed an illegal function, the police are on their way

  10. #10
    Bedankt,

    Het downloaden doet het nu.. Nu is alleen nog de vraag hoe ik een TProgressbar werkend kan maken.. Die heb ik namelijk ook op het formullier gezet.. Deze moet gaan lopen als hij gaat downloaden.. Hoe werkt zo'n TPrograssbar ??

  11. #11
    5th member of nldelphi
    Join Date
    Mar 2001
    Location
    Alkmaar
    Posts
    2,127

    Talking Progressbar.position

    Met progressbar.min:= 0; zet je de minimale waarde, en uiteraard
    met progressbar.max:=100; zet je de maximale waarde, deze kan bv ook op 1000 gezet worden als jij dat wilt, dan heb je dus 1000 stappen voordat deze 'vol' is
    om dan een waarde 'toe te kennen' aan de progressbar (dus laten oplopen) moet je het het volgende doen:
    Code:
    lus....
    
    progressbar.position:= progressbar.position + 1;
    if progressbar.position = 100 then showmessage('Downloaden voltooid.);
    
    lus einde....
    uiteraard moet deze regel in een lus komen te staan, en elke keer dat deze lus gepaseert wordt zal er 1% bij opgeteld worden.

    Hoe jij gaat uitlezen hoever je download al is weet ik ook niet, maar dat is dan je volgende probleempje denk ik.

    Als dit niet werkt dan zeg ik sorry, dit is ook maar uit het blote hoofje vanaf Kreta.
    Het kan ook nog zijn dat het met de property .VALUE werkt, maar het kan nu zijn dat ik de progressbar en gauge door elkaar heen gooi.

    Veel Succes.
    RLD

  12. #12
    Die werking klopt, maar ik vrees dat je in dit geval geen ProgressBar kunt zetten. Dat kan alleen als de routine DownloadFile een callback functie heeft die bijvoorbeeld ieder procent wordt aangeroepen. Zoals het nu is roep je een routine aan die gaan downloaden en pas weer terug komt als het downloaden gereeed is.`
    Marcel

  13. #13
    Ik ben zelf even wezen surfen op het net, en kwam toen de volgende code tegen:

    Code:
    Procedure TForm1.CopyFileWithProgressBar(Source, Destination : string);
    var
      FromF,
      ToF : file of byte;
      Buffer : array[0..4096] of char;
      NumRead : integer;
      FileLength : longint;
    begin
      AssignFile(FromF,Source);
      reset(FromF);
      AssignFile(ToF,Destination);
      rewrite(ToF);
      FileLength:=FileSize(FromF);
      With Progressbar1 do
      begin
        Min := 0;
        Max := FileLength;
        while FileLength > 0 do
        begin
          BlockRead(FromF,Buffer[0],SizeOf(Buffer),NumRead);
          FileLength := FileLength - NumRead;
          BlockWrite(ToF,Buffer[0],NumRead);
          Position := Position + NumRead;
        end;
        CloseFile(FromF);
        CloseFile(ToF);
    end;
    
    
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      CopyFileWithProgressBar('c:\Windows\Welcome.exe','c:\temp\Welcome.exe');
    end;
    Deze code is echter wel voor het kopieren op de harde schijf zelf. Hier wordt dus geen gebruik gemaakt van een internetverbinding, maar is deze code niet om te vormen naar hetgene dat ik nodig heb ?? En zo ja, hoe zouden jullie dat dan aanpakken ??

  14. #14
    Je zoekt de verkeerde kant op want je had tenslotte de juiste functie al gevonden. Het is dan meestal niet juist om naar een andere functie te gaan zoeken om user-interface redenen. In dit geval zelfs niet nodig. De syntaxt van de routine die je gebruikt ziet er als volgt uit:
    Code:
    function URLDownloadToFile(Caller: IUnknown; URL: PChar; 
      FileName: PChar; Reserved: DWORD; StatusCB: IBindStatusCallback): HResult; stdcall;
    De StatusCB parameter is degene die je moet hebben, deze is van het type IBindStatusCallback, die interface ziet er als volgt uit:
    Code:
      IBindStatusCallback = interface
        ['{79eac9c1-baf9-11ce-8c82-00aa004ba90b}']
        function OnStartBinding(dwReserved: DWORD; pib: IBinding): HResult; stdcall;
        function GetPriority(out nPriority): HResult; stdcall;
        function OnLowResource(reserved: DWORD): HResult; stdcall;
        function OnProgress(ulProgress, ulProgressMax, ulStatusCode: ULONG;
          szStatusText: LPCWSTR): HResult; stdcall;
        function OnStopBinding(hresult: HResult; szError: LPCWSTR): HResult; stdcall;
        function GetBindInfo(out grfBINDF: DWORD; var bindinfo: TBindInfo): HResult; stdcall;
        function OnDataAvailable(grfBSCF: DWORD; dwSize: DWORD; formatetc: PFormatEtc;
          stgmed: PStgMedium): HResult; stdcall;
        function OnObjectAvailable(const iid: TGUID; punk: IUnknown): HResult; stdcall;
      end;
    Het lijkt er dus op dat je een object moet maken die deze interface ondersteunt, deze als parameter mee moet geven en in de routine OnProgress je progressbar moet gaan updaten.
    Marcel

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Similar Threads

  1. Vraag over connectie maken met database
    By UserName in forum Databases
    Replies: 9
    Last Post: 10-Sep-03, 13:24

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •