07. januar 2001 - 16:21Der er
76 kommentarer og 1 løsning
Kopierer filer ved buttonclick til kilde som er i Edit2
Jeg har en Edit2 som har teksten C:\\programmer\\EasyWriters, kan jeg så ikke ved at trykke på en button2 kopierer fil(erne) til den destination som er som tekst i Edit2? Og så for at være hel besværlig aktivere Gauge2 som følger hvor langt den er nået i process????
Det virker ikke??? Den siger at: [Error] Unit1.pas(45): Undeclared identifier: \'CopyFiles\' [Fatal Error] Project1.dpr(8): Could not compile used unit \'Unit1.pas\' Hvad kan det skyldes?
Nu er jeg altså ikke helt så meget inde i Delphi så hvor skal : Procedure FileCopy(Const sourcefilename,targetfilename: String); Var S,T: TFileStream; Begin S := TFileStream.Create(sourcefilename,fmOpenRead); try T := TFileStream.Create(targetfilename,fmOpenWrite or fmCreate); try T.CopyFrom(S,S.Size); finally T.Free; end; finally S.Free; end; end;
Undskyld Snowball jeg havde ikke set dit eksempel!!! Men sourcekoden virker ikke! Der står en masse med violation når jeg prøvet at åbne projektet.... Men ud fra exe filen kan jeg se at den ikke ligner min helt!!! Ved mig er der en Edit2 øverst med destination som tekst... Under den er der en Gauge (Proceslinie - Men efter hvad jeg har hørt er det kun helt professionelle der kan finde ud af det så ;) ) Og derunder er der en Button1 som sætter processen i gang. altså kopiere filerne fra en kilde som står i sourcen til den destination der står som tekst i Gaugen!!!!
Hey nu virker det jeg kom bare til at skrive en af koderne forkert :) WUPS!!!! Men når den kopierer kommer der jo en Windows Dialog frem kunne man ikke få den til at gå væk og så bare at der ikke kom noget (For gauge er jo udelukket ;) )
Det ved jeg faktisk ikke om man kan med den funktion som borrisholt har lavet !
Men du kan også bruge et direkte API kald som hedder Copyfile, men det er bare et helvede og bruge hvis du skal kopiere mere end en fil da du så selv skal finde ud af hvor mange filer der ligger i folderen og så skal du også bruge ting som FindFirst, FindNext osv. !
Det jeg har lavet er blot en wrapper omkring Windows API\'ens TSHFileOpStruct. Ud over de så skulle det vel heller ikke være så svært at skrive en selv.
prodoc>> Hvis vi så skal vende tilbage til dit oprindelige spørgsmål, så for at besvare det skal vi lige have nogle ting på plads :
Hvis du skal kopiere en fil skal du vide hvor fra og hvor til ..... Da du ikke skriver noger on dit kilde biblotek vil jeg i det efter følgende formode det er D:\\123 Altså et biblotek direkte i roden af dit D: drev ved navn 123.
Så i toppen af din unit der indeholder din form skriver du i forlængelse af de andre uses clausuler tilføjer du filehandling. altså sådan at ofrst at hvis du har et standart projekt så ser de første linjer såleses ud :
borrisholt: Da jeg skrev \"Det ved jeg faktisk ikke om man kan med den funktion som borrisholt har lavet !\" så var det et svar til om man kunne fjerne den boks der kommer frem (Copying Files...) når man kopiere filerne!!!
Jeg ved godt at man kan bruge wildcards. Har selv tidligere brugt din FileHandling med stor succes i mine egne programmer ;) (og tak for det!)
Snowball >> Den største fornøjelse er da alligevel folk som dig der åbenlyst har stor glæde af noget af mit arbejde .. Så tak for det ...
Som jeg skrev så bygger uniten på en wrapper omkring TSHFileOpStruct, som i C++ hedder SHFILEOPSTRUCT. Med den viden kan du faktisk slå den op i Online hjælpen. Så vil du se at hvis du ønsker at fjerne den dialog der dukker op når du kopierer så er det blot er spørgsmål om at stoppe flaget FOF_SILENT på ....
borrisholt: Tak for den info. Så lærte jeg også noget idag ;)
Jeg kunne dog ikke umiddelbart finde noget om det hverken i Delphi\'s hjælp eller på search.borland.com men fandt noget om det på en anden side (http://ddelphi.hypermart.net/delphi/files.html)
snowball >> Vil det sige at hvis du inde i din Delphi skriver SHFILEOPSTRUCT og så trykker F1 så får du ikke online hjælpen på dette område ? I bekræftendefald skal du rebuilde hele dit hjælpe system ...
Store dele af Delphi\'s hjælp omkring Windows API er foræller eller mangelfuld alligevel, så etenlig betyder det ikke så meget ... Brug i stedetfor den til enhvertid nyeste MSDN ...
OKay godt mit spørgsmål er blevet et åbent chatboard ;) Men nu hvor borrisholt er kommer til, ku det være at du vidste hvordan man kunne følge kopierings-processen via en Gauge! (Procent linie).... Altså man trykker på button1 den begynder at kopiere fil(erne) til den mappe som står i Edit2-text samtidig aktiverer den en eller 2 gauges der viser \"Process This File\" og \"Process Total\"? Kunne det lade sig gøre???? Det ville være rimelig dejligt hvis i vidste eller kunne finde ud af det (er villig til at sætte flere point på spil ;) )
prodoc>> Det kan jeg godt vise dig ... Det er såmendt ikke så svært, men det kræver en masse kode, omkring 500 linjer ... Idet der skal skrives et par søge algoritmer ... Men hvis du insisterer (points) så vil jeg da gerne ....
Er der nogen grund til ikke bare at lade Windows klare det for dig ?
Borrisholt> Ja det er fordi jeg er ved at lave et installations program til et lille hjemmelavet skriveprogram (Rimelig primitivt!!!! ;) ) og så vil jeg gerne lave at det ser professionel ud..... Med en Gauge osv... og at den ikke benytter Windows default...... Grunden til at jeg ikke bruger et installprogram der laver det hele for mig er at jeg har en helt speciel íde til design til installations programmet ;)
Slepyee> Jeg tror koden virkede i starten men der ved: FileArray1[1]:=\'.\\Thisfile.txt\'; FileArray1[2]:=\'.\\Pjoject1.exe\'; {etc. ...} FileArray2[1]:=\'\\Thisfile.txt\'; FileArray2[2]:=\'\\Project1.exe\';
er det med Pjoject1.exe en fejl eller med vilje????? Du ville vel ikke gøre mig en tjeneste at sende den form der helt sikkert virker med at når man trykker på button1 så kopierer den en fil (FX. /EasyWriters/*.*) til den mappe som står som tekst i Edit2?????
Jeg skal se hvad jeg kan gøre... Men det kommer nok til at tage et stykke tid, da jeg ikke sidder ved en \"Delphi computer\" lige nu!!! Du hører nærmere i dag...
Borrisholt> Wau det er lige det jeg ville have men hvordan kan det være at når jeg ændrer den adresse til en anden fx:
Form2.Show(\'C:\\Programmer\\Borland\\Delphi5\\Projects\\\',\'C:\\hest\\\'); til Form2.Show(\'\\EasyWriters\\\',\'edit2.text\');
Kan man ikke godt skrive det sådan hvis det skal ligge på en cd??? (\\EasyWriters\\?
Og hvad skal man ændrer i koden for at de 2 gauges er i samme form som button2 ??? Håber ikke jeg er for besværlig....(Men jeg lover dig, at hvis du vil gøre det så kommer der sikkert en lille julebonus.... ;) )
Slepee> Du skal osse nok få din fortjeneste, hvis du bare lige gad skrive et svar så kunne jeg give dig nogle trøstepoints når jeg engang er færdig med at få hjælp :)
prodoc>> nej den kan ikke arbrjde med relative stier .. Det kunne du jo etv selv lave ....
Lidt hjælp til det kan du da godt få :
der findes en funktion der hedder GetCurrentDir som retunerer dig det nuværende biblotek, uden backslash ...
Der udover så \' (plinger) brugen kun når du har en streng der skal se præcis sådan ud : så hvis du skriver
var s : String;
s:= \'Edit2.Text\';
Så ligger værdien af Edit2.Text IKKE i s, men der i mod en streng bestående af bogstaverne E d i t 2 . t e x t
skal du kopiere værdien af Edit2.text ind i en streng så skal du skrive :
var s : String;
s:= Edit2.text;
Følger vi det her lidt videre så bliver : Form2.Show(\'\\EasyWriters\\\',\'edit2.text\'); til Form2.Show(GetCurrentDir+\'\\EasyWriters\\\',edit2.text);
Borrisholt> Jamen det er hvis det skal ligge på en cd (Jeg vil prøve at lave en helt cd med installation osv...) Så skal cd\'en se således ud: \\EasyWriters\\ install.exe autorun.inf Help.txt Så den skal fra installationsmenuen kunne kopiere mappen \\Easywriters\\ til den mappe som står i Edit2??????????????
Jeg kan ikke forstå hvad der er galt, jeg kan godt starte projektet men når jeg prøver at trykke på button1 viser den siger følgende fejl: Project Project1.exe raised exception class EInOutError with message \"invalid filename\". Process stopped. Use Step or Run Continue ?????????????
prodoc>> M.H.T. \"Project Project1.exe raised exception class EInOutError with message \'invalid filename\'. Process stopped. Use Step or Run Continue\" - betyder at du har angivet et forkert filnavn og kopiere! Den kan ikke finde filen(eller der opstod en anden form for IO-fejl) og beder dig Trykke \"Run\" eller \"Continue\" for at fortsætte programudførelsen! Dette skyldes Windows\'s PM (Protected Mode) udførsel... Hvis ikke den blev udført m. PM ville programmet bare fortsætte og lave \"ged i den\"! -Mildest talt! :) ------------ prodoc>> Hvad mener du med TO Gauges?? Mener du sådan at den ene Gauge (\'1\') Viser hele installationsprocessen, og den anden (\'2\') Viser den enkelte fil\'s process??? I det tilfælde skal du bruge API-functionen CopyFileEx() . eller lave en kopierings-funktion selv! Og det er temmelig besværligt, og er ikke at foretrække, da det så vil undertrykke de \'Sikre\' API kald!
Borrisholt> Jeg er ikke helt \"grøn\" inden for delphi men jeg har aldrig lavet et så stort projekt før. Men ville det være meget svært at gøre det sådan at der i den der \"FileCopy\" at der i form 1 var en \"Edit2\" som styrede hvor den skal kopiere filerne hen? (Det vi snakkede om tidligere)????
Slepee>Jeg vil gerne have et installations program hvor der er en edit 2 2 gauges (Ja den ene skal vise total process og den anden viser hvor langt den er nået med Den ene fil den er ved at kopiere! - Såi bunden skal der være en button2 som sætter \"kopier filerne til den mappe som er skrevet som tekst i edit2!) Håber du forstår hvad jeg mener?
prodoc>> Det der med CD\'en og edit2 har jeg allerede besvaret en halv snesgange, men lad mig da bare gøre det igen ....
Du tager mit projekt som du fik det fra mig ... så vil du gerne kopiere de filer der ligger i .\\EasyWriters\\ til hvad nu brugeren har skrevet i Edit2 ! Right ?
skriver du blot : Form2.Show (GetCurrentDir+\'\\EasyWriters\\\',edit2.text);
slepee>> Jeg har sendt prodoc et projekt der kunne præcis det han bad om ... I den har jeg oversyret show proceduren på den form det laver det hele ... den nye show procedure vil have to argumenter : en kilde og en destination ....
zill_eye >> Det viste sig at vores gode ven prodoc selv ville foretage kopieringen .. og derfor kan windows API\'en ikke bruges, som ellers foreslået af ubtertegnede 08/01 2001 08:38:47 .. Jeg sendte manden et eksempel der gjore præcis som han ønskede .... Og så døde det hele ...
Jamen I må undskylde men jeg er ikke helt inde i Delphi endnu, som Borrisholt har hentydet til... Så derfor har jeg sat pointsne op til 100 i stedet for. Så at der igen vil være lidt udfordring ved spørgsmålet.... zill_eye>Og tak for dit indslag men som Borrisholt har sagt er det ikke helt den process jeg leder efter... Hvis du vil kunne du se et screenshot jeg lige hurtigt har lavet... http://home9.inet.tele.dk/tman/Filer/easyw.jpg TAK!
Hvorfor siger den det her? Project Project1.exe raised exception class ElnOutError with message \"I/O error 32\". Process stopped. Use Step or Run to continue.
Eller skal jeg installere de 2 pas filer som komponenter?
Ja jeg ved det godt! men den siger altså at der er fejl ved: Reset (fromFile,1); Men efter at den viser problemet kan jeg godt trykke RUN igen, men så efter lidt tid siger den det samme problem igen, det som jeg skrev i \"30/01 2001 21:55:32\" Hvad kan det være?
Hey Borrisholt, det virker nu!!! Man skulle åbenbart ignorere de run fejl den sendte når man prøver at RUN! for når man kører EXE filen ude for delphi så virker det!!!!!!!!! :) Men den der Status memo kan jeg ikke gemme slette den????
\"Kan jeg ikke bare skrive: Go (\'C:\\Documents and Settings\\Administrator\\Skrivebord\\Delphi\\FileCopy\\EasyWriters\\\',\'edit2.text\');
I stedet for Go (\'C:\\Programmer\\Borland\\Projects\\\',\'C:\\Hest\'); \"
Nej næsten hvis du jævnfør mit svar af 08/01 2001 08:38:47, vil du se at du skal skrive Go (\'C:\\Documents and Settings\\Administrator\\Skrivebord\\Delphi\\FileCopy\\EasyWriters\\\',edit2.text); UDEN plinger.
Yes nu virker det næsten ;) Men - når jeg tager en mappe fra DirectoryListboxen skriver den fx. C:\\Programmer\\123 i edit2\'en - og det må den ikke for så kommer alle de filer jeg kopierer nemlig ind i C:\\Programmer\\ og så hedder alle filerne 123project1.exe (altså alle filernes navne starter med 123?) kan jeg ikke få den til at skrive \\ til sidst i edit2.text efter kilden så der kommer til at stå C:\\Programmer\\123\\ ?
Og så har jeg lige det sidste ? kan man ikke indstille sin directoryListbox til at opdaterer hver gang der er gået et vis antal sek? sådan at hvis man har lavet en ny mappe så finder den ud af det med det samme, i stedet for at man skal genstarte programmet før end at den finder de nye mapper?
Borrisholt> Jamen \"Chat sessionen\" bliver jo ikke kortere, når du hele tiden svarer med en kommentar ;) Men det hele virker nu mangler bare lige at få den til at skrive det backslash i den edit2!!!!!! Og så kunne det være dejligt hvis man kunne få DirectoryListboxen til at opdaterer hver gang man går ind i en ny mappe!
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.