Avatar billede Slettet bruger
12. december 2007 - 19:54 Der er 11 kommentarer og
1 løsning

Ændre sti til kopierede billede

begin
Minitable1.Edit;
if

Op.Execute then

ImageHolder.Picture.Bitmap := Nil;

Billedsti.Text := '';

ImageHolder.Picture.LoadFromFile(Op.FileName);

Billedsti.Text := Op.FileName;

CopyFile(PChar(Op.FileName),PChar('c:\programmer\test\images'+'\'+ExtractFileName(Op.FileName)),
False);


Jeg bruger denne kode når jeg åbner en TpictureDialog. Koden gør at den kopierer det valgte billede til nedenstående sti, og skriver i en dbedit hvor billedet er hentet fra.

c:\programmer\test\images

f.eks

Jeg henter et billede fra c:\temp og gemmer det i c:\programmer\test\images

Men i min dbedit står der c:\temp


spørgsmål:

Den måde er ikke smart da det indlæste billede sti ikke svare til placeringen efter kopieringen. Hvordan klare jeg den?
Avatar billede hrc Mester
12. december 2007 - 23:56 #1
Jeg antager at BilledSti er en TDBEdit, ikke? Hvis det er, er det datasættet du skal sætte til den nye sti så retter teksten sig ind derefter:

with BilledSti do
  DataSource.DataSet.FieldByName(DataField).AsString := Op.Filename;
Avatar billede hrc Mester
12. december 2007 - 23:57 #2
Du kan også skrive det sådan: Minitabel1.FieldByName('sti').AsString := Op.Filename;
Avatar billede Slettet bruger
13. december 2007 - 14:19 #3
Ja billesti er en dbedit....

Hvis man sætter: Minitabel1.FieldByName('sti').AsString := Op.Filename;

Jeg ønsker netop ikke at indlæse stien fra op.filename da den er ligegyldig men stien til hvor den kopieres til.

Hvis jeg med "op" henter en fil fra c:\images\test.jpg
og den kopieres til c:\programmer\test\images

Så skal der i billedsti stå: c:\programmer\test\images\test.jpg
Avatar billede hrc Mester
14. december 2007 - 00:18 #4
Du gør da bare sådan her:

var
  DestDir: string;

...

  DestDir := IncludeTrailingPathDelimiter('c:\programmer\test\images')+ExtractFileName(Op.FileName);
  Minitabel1.FieldByName('sti').AsString := DestDir; // ???????????
  CopyFile(PChar(Op.FileName),PChar(DestDir));
Avatar billede Slettet bruger
14. december 2007 - 10:21 #5
Hvad er:

IncludeTrailingPathDelimiter

Jeg bruger D5 Interprise og kan ikke finde den i hjælpen.
Avatar billede hrc Mester
17. december 2007 - 07:35 #6
Nå er den nyere? Sammen med ExcludeTrailingPathDelimiter gør de ikke andet end at tjekke stieen og indsætte et manglende \ eller fjerne det hvis det findes. Det garanterer her at der altid står et backslash. Måske har du den oprindelige version: IncludeTrailingBackslash?

Du burde opgradere din Delphi, om ikke andet så til en 7'er.
Avatar billede Slettet bruger
17. december 2007 - 08:45 #7
Borland har på et tidspunkt ryddet op i de funktioner i SysUtils som ikke er aktuelle mere.

Jeg har ikke pt. råd til en opgradering.

Men det virker nu.

Tak for hjælpen

Smid lige et svar.
Avatar billede hrc Mester
17. december 2007 - 09:25 #8
Kan man mon, jvf. licenreglerne, sælge en brugt Delphi? Er man skiftet til nyere version er den mere eller mindre forældet, læs værdiløs. Der sker meget på Delphi-fronten, men det er den mest homogene version og i forhold til 5'eren er der bl.a. kommet "align" på komponenterne. Slut med at skulle kode edit1.width := ClientWidth - edit1.left - 8; osv.
Avatar billede Slettet bruger
17. december 2007 - 13:25 #9
Jeg kan huske da jeg købte min, var reglerne at den var personlig og kunne ikke sælges eller gives væk. Men det kan da godt være at de har opdateres reglerne.

Et andet problem er også at de 3 parts componenter jeg bruger ikke findes til de nye versioner.
Avatar billede Slettet bruger
17. december 2007 - 14:09 #10
hmmm...her var jeg nok for huritg

Filen bliver ikke kopieret.

Når Datasettet prøver at finde filen stander programmet.

Her er koden:

DestDir := IncludeTrailingBackslash('c:\programmer\test\images')+ExtractFileName(Op.FileName);
Minitable1.FieldByName('dummi0').AsString := DestDir;
CopyFile(PChar(Op.FileName),PChar('c:\programmer\test\images'),false);


Den her bruger jeg i onChange i Datasource

Den virker selfølgelig ikke hvis billedet ikke kopieres.

ImageHolder.Picture.LoadFromFile(Billedsti.Text);
Avatar billede hrc Mester
17. december 2007 - 22:07 #11
Hvis jeg forstår dig ret har du en tabel hvori du registrerer filens placering, i destinationskataloget. Når du har kopieret en fil vil du gerne vise det.

Du bruger datasæt og komponent ret tilfældigt. Brug altid datasættet når du har det til rådighed. Brugerne har ikke adgang til den og må bruge TDBEdit'en.
Når der er skrevet i tabellen bliver der ikke posted. Det glemte jeg også at skrive, men når der postes bliver TDBEdit'en også opdateret.
Endelig bruger du den forkerte event i TTablen. Brug ikke OnChange, men OnScroll.

Har forsøgt at vise det nedenfor i et aldeles utestet eksempel:

Antager at Billedsti via en TDatasource er koblet til et felt i Minitable1 der hedder Dst. Koden er pseudo men det er grundtrækken på hvordan man gør.

// En TButton.OnClick
procedure TForm1.OnFileLookupClick(Sender: TObject);
var
  Src, Dst: string;
  LastError: integer;
begin
  if OP.Execute then
  begin
    Src := OP.Filename;
    Dst := IncludeTrailingBackslash(ImageDir) + ExtractFilename(Src);
    if CopyFile(pchar(Src),pchar(Dst),false) then
    begin
      Minitable1.Insert;
      Minitable1.FieldByName('dst').AsString := Dst;
      Minitable1.Post; // Nu skulle BilledeSti opdateres.
    end
    else begin
      LastError := GetLastError; // Gør et eller andet med fejlkoden
      case LastError of
        ERROR_FILE_NOT_FOUND: raise Exception.CreateFmt('%s ikke fundet',[Src]);
        ...
      end;
    end;
  end;
end;

// Bruger tabellens OnScroll, ikke OnChange
procedure TForm1.Minitable1OnScroll(DataSet: TDataSet);
begin
  Imageholder.Picture.LoadFromFile(DataSet.FieldByName('dst').AsString);
end;

Hvis du laver multiselect på filerne (i OP) må du forhindre at OnScroll kaldes for hver fil du kopierer.
Avatar billede Slettet bruger
18. december 2007 - 01:25 #12
Tak for den grundige hjælp men problemet blev løst ved at sætte den i AfterScroll og lave en update for at billedet vises i imageholder.

programmet vil jo stoppe når der opstår en fejl og ikke køre copyfile og efter den ændring så ser det ud til at køre.

Jeg takker endnu en gang for din store hjælp
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