Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Probelme mit Datein in Datenbanken (https://www.delphipraxis.net/2367-probelme-mit-datein-datenbanken.html)

foxy 20. Jan 2003 09:57


Probelme mit Datein in Datenbanken
 
Guden all .... habe folgendes Problem ....
also
ich habe Paradox7 DB mit verschiedenen Datensätz.
Dann habe ich 2 Spalten, in denen Datei eingelagert werden sollten, die eine Grafikdateien(Graphic) die andere alle anderen Arten von Datein (Blob)...
so nur hab ich ein problem ich füge einem Datensatz so die datei zu
Delphi-Quellcode:
if opendialog1.Execute then
   begin
     pfad:=opendialog1.FileName;
     if (ExtractFileExt(OpenDialog1.FileName)='.bmp') then
       begin
        Table1.Edit;
        Table1File.AsString:=pfad;
        Table1BMP.LoadFromFile(pfad);
        DBlistbox1.Items.Add(pfad);
        Table1.Post;
        Pagecontrol1.ActivePageIndex:=2;
       end
     else
      begin
        Table1.Edit;
        Table1File.AsString:=pfad;
        Table1Datei.LoadFromFile(pfad);
        DbListbox1.Items.Add(Pfad);
        Table1.Post;
        Pagecontrol1.ActivePageIndex:=2;
      end;
     end;
alles schön und gut dann steht da auch der pfadname und anscheinend ist auch die Datei in dem entsprechenden feld.
dann kommt das erste Probelm .. schliess ich delphi und öffne es nochaml, dann sind die datensätze noch da nur die dateien nicht mehr.
2. Problem
ich will dann mit doppelklick auf den DBgrid die Dateien öffnen das mache ich so
Delphi-Quellcode:
 if FileExists(Table1.FieldbyName('BMP').AsString) then
      Begin
        Form4.Show;
      end
  else If FileExists(Table1.FieldByName('Datei').AsString) then
       Begin
          GetExe(ExtractFileExt(OpenDialog1.FileName));
       end;
aber wenn ich überprüfe ob eine datei da iss findet er keine ... :( bitte um hilfe was amche ich falsch???

Hansa 20. Jan 2003 11:09

Hi,

hast Du Dich da nicht vielleicht mit FileName, FieldByName ('BMP'),ExtractFileExt, usw. irgendwie verzettelt ? Gehe mal am besten alles wieder von vorne durch und lasse dir im Debugger oder mit Showmessage an verschiedenen Stellen die entsprechenden Werte anzeigen, um zu sehen, ob alles so stimmt. Vielleicht sieht irgendjemand anderes einen Fehler, auf die Schnelle sehe ich keinen.

Gruß
Hansa

foxy 20. Jan 2003 11:21

erst ma thx .... aber ich habe scho alles geprüft FieldByName Stimmt ..... also die namen die richtigen werte kommen auch raus also der pfad etc.... ich denke auch das der die file in die db läd, aber 1. sie bleibt da nich drin also wenn ich die db ausmache also auf false, dann sind die datensätze noch da nur die files nimma ... 2. ich merke es daran, denke ich ma das die files da drin sind, weil der rechner an der stelle bissal länger braucht 1 sec oder .... ich weis einfach nich weiter :(

harrybo 20. Jan 2003 12:44

hi foxy, möglicherweise klappt es, wenn Du FieldByName verwendest. Bischen aufgeräumt habe ich auch noch, sollte aber keine Auswirkungen haben.
Delphi-Quellcode:
procedure ...
var
  pfad, vFieldName : string;
begin
  if opendialog1.Execute then begin
    pfad := opendialog1.FileName;
    if ExtractFileExt(pfad)='.bmp' then
      vFieldName := 'BMP'
    else
      vFieldName := 'Datei';
    with Table1 do try
      DisableControls;
      Edit;
      FieldByName('File').AsString := pfad;
      FieldByName(vFieldName).LoadFromFile(pfad);
      Post;
    finally
      EnableControls;
    end;
    DBlistbox1.Items.Add(pfad);
    Pagecontrol1.ActivePageIndex:=2;
  end;
end;
Viel Erfolg, harrybo

harrybo 20. Jan 2003 13:12

hi foxi,
zu Deinem zweiten Problem: ich verstehe nicht ganz, was in die Zeile
Delphi-Quellcode:
GetExe(ExtractFileExt(OpenDialog1.FileName));
die GetExe mit der FielExtension machen soll. Ich nutze zum Starten externer Dateien mit der zugehörigen Application ShellExecute und habe mir dafür eine kleine Funktion geschrieben:
Delphi-Quellcode:
// in Abschnitt interface
function StartFile (Hdl: word; FileStr: String; Par: String ): integer;

// in Abschnitt implementation
function StartFile (Hdl: word; FileStr: string; Par: string ): integer;
var
  i   : integer;
  path : string;
  vErr : string;
begin
  FileStr := FileStr + chr(0);
  path   := '' + chr(0);
  try
    i := shellexecute(Hdl, nil, @FileStr[1], @Par[1], @path[1], SW_SHOW);
  except
    vErr := 'Problem beim Starten der externen Datei';
    MessageDlg(vErr, mtInformation, [mbOk], 0);
    i:= -1;
  end;
  result:= i;
end;
Dein Aufruf sähe dann so aus:
Delphi-Quellcode:
procedure ...
var
  vFileName : string;
begin
  if FileExists(Table1.FieldbyName('BMP').AsString) then
    Form4.Show
  else begin
    vFileName := Table1.FieldByName('Datei').AsString;
    If FileExists(vFileName) then
      StartFile(Handle, vFileName, '');
  end;
end;
Nochmals viel Erfolg, harrybo

foxy 21. Jan 2003 07:48

getexe iss eine Function, die rausfindet, über die registry, welche dazugehörige Programm zu der entsprechenden .xxx gehört
Delphi-Quellcode:
function GetExe(Ext:string):string;
var reg   : TRegistry;
    s     : String;
Begin
  s:='';
  reg:=TRegistry.Create;
  reg.RootKey:=HKEY_CLASSES_ROOT;
  if reg.OpenKey('.'+ext+'\shell\open\command', false) then
   begin
    s:=reg.ReadString('');
    reg.CloseKey;
  end
  else begin
    if reg.OpenKey('.'+ext, false) then begin
      s:=reg.ReadString('');
      reg.CloseKey;
      if s<>'' then begin
        if reg.OpenKey(s+'\shell\open\command', false) then
          s:=reg.ReadString('');
          reg.CloseKey;
      end;
    end;
  end;
  if Pos('%', s)>0 then
    Delete(s, Pos('%', s), length(s));
  if ((length(s)>0) and (s[1]='"')) then
    Delete(s, 1, 1);
  if ((length(s)>0) and (s[length(s)]='"')) then
    Delete(s, Length(s), 1);
  while ((length(s)>0) and
   ((s[length(s)]=#32) or (s[length(s)] = '"'))) do
    Delete(s, Length(s), 1);
  result := s;
end;
aber dennoch thx für deine Hilfe ... ich denke ich verwende einfach nur den Pfad in der DB :roll:

harrybo 21. Jan 2003 13:55

Hi foxy,
Deiner Antwort kann ich leider nicht entnehmen, ob Dir mein Codebeispiel zu 1 weitergeholfen hat.

Zu 2: Shellexecute würde ich dennoch dem Stöbern in der Registry vorziehen. Es startet ein File, ähnlich, als würde man auf dieses doppelt klicken. Welche Application nun gestartet wird übernimmt das System, GetExe wird damit überflüssig. Zumindest sehe ich im Moment keinen Vorteil von GetExe, zumal: das gefundene Programm muss dann immer noch aufgerufen werden, mit dem entsprechend zu ladenden File als Parameter.

gruß, harrybo

Hansa 21. Jan 2003 17:38

Hi Foxy,

hehe :mrgreen: Das hast Du nun davon. Ich hab es Dir ja prophezeit. In dem anderen Thread habe nur ich Dir gepostet. Anscheinend verstehe mittlerweile nur noch ich den Zusammenhang zwischen den Threads. In dem anderen stehen die Antworten schon zu ca. 80 % drin und hier weiß keiner was davon, die wundern sich nur, daß keine Fragen mehr kommen. Wie denn auch ? :wall: Wenn ich das Gröbste schon woanders geklärt habe. Wenn Du Pech hast, hängst Du jetzt länger am Rest, als an den 80 %. Jetzt muß ich selber überlegen, was da noch übrig war :?:

Der arme Harrybo beantwortet Dir Fragen, zu denen Du von mir schon längst ein Beispiel hast. Hoffentlich siehst Du, daß er ungefähr dasselbe schreibt wie ich. In Zukunft würde ich diesen Unfug sein lassen. Dann wärst Du wahrscheinlich schon fertig. Wie heißt es : "Viele Köche verderben den Brei!" Und Du kochst ihn noch an 10 Stellen gleichzeitig. :mrgreen:

Gruß
Hansa


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:24 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