Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Filmarchiv in Delphi (https://www.delphipraxis.net/5987-filmarchiv-delphi.html)

Chewbacca 25. Jun 2003 16:31


Filmarchiv in Delphi
 
Gudn Tach!
Ich hab folgendes Problem: Ich sollte ein Programm mit Records, die in Files absoeicherbar sind, schreiben(siehe Joe.fresh). Der befehl zum schreiben funktioniert scheinbar, jedoch bekomme ich eine Fehlermeldung soblad ich specihern möchte: Kein Zugriff auf die Datei!
Was soll das?!? Liet das vielleicht daran, dass ich mit 2 Units arbeite?
Außerdem hab ich keine Ahnung wie ich beim Programmstart alles in der Datei enthaltene in einem Stringgrid ausgebe! D.h. wie ich den Zeiger in der Datei so lange verschiebe und alles ausgeben lass bis er bei EOF ist!
Das ist der Quelltext der Unit1, in der die Stringrid vorhanden ist, auf der alles ausgegeben werden soll.
Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  ExtCtrls, StdCtrls, Buttons, Grids, ComCtrls, Menus, Unit2;

type
  TForm1 = class(TForm)
    Label1: TLabel;
    Image1: TImage;
    Image2: TImage;
    StringGrid1: TStringGrid;
    BitBtn1: TBitBtn;
    BitBtn2: TBitBtn;
    BitBtn3: TBitBtn;
    MainMenu1: TMainMenu;
    Datei: TMenuItem;
    Neu1: TMenuItem;
    SpeichernUnter1: TMenuItem;
    Speicher1: TMenuItem;
    N1: TMenuItem;
    Hilfe1: TMenuItem;
    Sortrieren1: TMenuItem;
    Kurzhilfe1: TMenuItem;
    Titel1: TMenuItem;
    Bildqualitt1: TMenuItem;
    Humor1: TMenuItem;
    Action1: TMenuItem;
    Spannung1: TMenuItem;
    Medium1: TMenuItem;
    AnzahlDatentrger1: TMenuItem;
    N2: TMenuItem;
    ArchivSchlieen1: TMenuItem;
    ProgrammBeenden1: TMenuItem;
    Ansicht: TMenuItem;
    Archiv1: TMenuItem;
    BearbeitDingBlatt1: TMenuItem;
    procedure BitBtn1Click(Sender: TObject);
    procedure BitBtn2Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure ProgrammBeenden1Click(Sender: TObject);
    procedure Archiv1Click(Sender: TObject);
    procedure BearbeitDingBlatt1Click(Sender: TObject);
    procedure ArchivSchlieen1Click(Sender: TObject);
    procedure Neu1Click(Sender: TObject);
    procedure N1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation



Type TDatei = File Of TFilm;

{$R *.DFM}

Var Movie:TDatei;


procedure TForm1.BitBtn1Click(Sender: TObject);
begin
Form1.close;
Form2.close;
end;

procedure TForm1.BitBtn2Click(Sender: TObject);
begin
Form1.Hide;
Form2.Show;
end;

procedure TForm1.FormCreate(Sender: TObject);
Begin
With Stringgrid1 Do
Begin
cells[0,0]:='Filmtitel';
cells[1,0]:='Bildqualität (1-10)';
cells[2,0]:='Humor (1-5)';
cells[3,0]:='Spannung (1-5)';
cells[4,0]:='Action (1-5)';
cells[5,0]:='Medium';
cells[6,0]:='Anzahl Datenträger';
End;
Assignfile(Movie,'Movie.fur');
If fileexists('Movie.fur')
  Then
  begin
   reset(Movie);
  end
   else
   Begin
    rewrite(Movie);
    Stringgrid1.rowcount:=filesize(Movie)+1;
    End;
end;

procedure TForm1.ProgrammBeenden1Click(Sender: TObject);
begin
close;
end;

procedure TForm1.Archiv1Click(Sender: TObject);
begin
Form1.Show;
Form2.Hide;
end;

procedure TForm1.BearbeitDingBlatt1Click(Sender: TObject);
begin
Form1.hide;
Form2.show;
end;

procedure TForm1.ArchivSchlieen1Click(Sender: TObject);
begin
CloseFile(Movie);
end;

procedure TForm1.Neu1Click(Sender: TObject);
begin
rewrite(Movie);
end;

procedure TForm1.N1Click(Sender: TObject);
begin
reset(Movie);
end;

end.
Das ist der Quelltext der 2. Unit in der mehrere Edit Fenster die Eingabe ermöglichen und in der auch der Speciher, also einlese Button vorhanden ist:
Delphi-Quellcode:
unit Unit2;

interface

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

type
 TFilm = Record
  Filmtitel:String[50];
  Qualitaet:Byte;
  Humor:Byte;
  Spannung:Byte;
  Action:Byte;
  Medium:TCombobox;
  Datent:Byte;
 End;
  TForm2 = class(TForm)
    BitBtn1: TBitBtn;
    Edit1: TEdit;
    Label1: TLabel;
    Edit2: TEdit;
    Label2: TLabel;
    Edit3: TEdit;
    Label3: TLabel;
    Label4: TLabel;
    Edit4: TEdit;
    Edit5: TEdit;
    Label5: TLabel;
    Label6: TLabel;
    BitBtn2: TBitBtn;
    ComboBox1: TComboBox;
    BitBtn3: TBitBtn;
    Edit6: TEdit;
    Label7: TLabel;
    MainMenu1: TMainMenu;
    Datei1: TMenuItem;
    FilmSpeichern1: TMenuItem;
    Ansicht1: TMenuItem;
    Archiv1: TMenuItem;
    BearbeitDingBlatt1: TMenuItem;
    Hilfe1: TMenuItem;
    Kurzhilfe1: TMenuItem;
    ProgrammBeenden1: TMenuItem;
    procedure BitBtn1Click(Sender: TObject);
    procedure BitBtn3Click(Sender: TObject);
    procedure BitBtn2Click(Sender: TObject);
    procedure ProgrammBeenden1Click(Sender: TObject);
    procedure Archiv1Click(Sender: TObject);
    procedure BearbeitDingBlatt1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form2: TForm2;

implementation

uses Unit1;
Type TDatei = File Of TFilm;
{$R *.DFM}
Var Film:TFilm;
    Movie:TDatei;
procedure TForm2.BitBtn1Click(Sender: TObject);
begin
Form2.Hide;
Form1.Show;
end;

procedure TForm2.BitBtn3Click(Sender: TObject);
begin
Form1.close;
Form2.close;
end;

procedure TForm2.BitBtn2Click(Sender: TObject);
begin
With Film Do
Begin
If Edit1.text=''
   Then
       Begin
       Edit1.text:='';
       Showmessage('Sie müssen den Filmtitel definieren!')
       End
   Else
       Filmtitel:=(Edit1.text);
End;
Write(Movie,Film);
If (strtoint(Edit2.text)>10) Or (edit2.text='') Or (strtoint(Edit2.text)<0)
Then
Begin
Edit2.text:='';
showmessage('Nur Zahlen von 0-5 eingeben!')
End
Else
Qualitaet:=strtoint(Edit2.text);
If (strtoint(Edit3.text)>5) Or (Edit3.text='') Or (strtoint(Edit3.text)<0)
Then
Begin
Edit3.text:='';
showmessage('Nur Zahlen von 0-5 eingeben!')
End
Else
Humor:=strtoint(Edit3.text);
If (strtoint(Edit4.text)>5) Or (Edit4.text='') Or (strtoint(Edit4.text)<0)
Then
Begin
Edit4.text:='';
Showmessage('Nur Zahlen von 0-5 eingeben!')
End
Else
Spannung:=strtoint(Edit4.text);
If (strtoint(Edit5.text)>5) Or (Edit5.text='') Or (strtoint(Edit4.text)<0)
Then
Begin
Showmessage('Nur Zahlen von 0-5 eingeben!');
Edit5.text:=''
End
Else
Action:=strtoint(Edit5.text);
Medium:=(Combobox1);
If Edit6.text=''
Then
Begin
Edit6.text:='';
Showmessage('Sie müssen de Anzahl der Datenträger angeben!')
End
Else
Datent:=strtoint(Edit6.text);
End;


procedure TForm2.ProgrammBeenden1Click(Sender: TObject);
begin
close;
end;

procedure TForm2.Archiv1Click(Sender: TObject);
begin
Form2.hide;
Form1.show;
end;

procedure TForm2.BearbeitDingBlatt1Click(Sender: TObject);
begin
Form1.hide;
Form2.show;
end;

end.
Und falls ihr jetzt wirklich gar nix mehr zu tun habt könntet ihr mir noch nen Tipp geben wie ich die Stringrid später sortieren kann!
Vielen Dank jetzt schon ma!

Christian Seehase 25. Jun 2003 16:44

Moin Chewbacca,

erst einmal herzlich willkommen hier in der Delphi-PRAXiS.

Eine Bitte:
Könntest Du wohl bitte künftig so umfangreiche Sourcen als Attachement anhängen?
Die Leser des Threads werden's Dir danken ;-)

Niko 25. Jun 2003 17:25

Der Fehler liegt darin, dass du in jeder Unit mit einer eigenen Variablen Movie arbeitest; die in Unit2 wird allerdings nicht geöffnet, deshalb geht auch das Speichern nicht.
Du musst in Unit1
Code:
Var Movie:TDatei;
in den interface-Abschnitt verschieben und die selbe Deklaration in Unit2 löschen.
Übrigens würde ich auch die Deklaration von TFilm nach Unit1 verschieben. Nur der Übersicht halber...

Luckie 25. Jun 2003 17:28

Und kuck mal auf meiner Homepage, da habe ich eine Klasse für typisierte Dateien geschrieben (mit Demo).

Chewbacca 25. Jun 2003 17:58

Also ich hab die Deklaration aus Unit 2 raus kopiert und hinter "Implementation" geschrieben(war doch gemeint oder???)
Auf jeden Fall sagt er mir jetzt, dass Movie (beim write-Befehl) undefiniert sei!
HILFE!!!
Danke schon ma!

Christian Seehase 25. Jun 2003 18:04

Moin Chewbacca,

Zitat:

Zitat von Niko
in den interface-Abschnitt verschieben

Zitat:

Zitat von Chewbacca
und hinter "Implementation" geschrieben(war doch gemeint oder???)


Chewbacca 25. Jun 2003 18:22

Also wahrscheinlich bin ich einfach zu blöd, aber ich bekoomm das nich so gebacken, dass alles so steht, dass es voneinandr abhängig sein kann. Also Movie in Interface Folglich TDatei vornedran und dann aber auch TFilm auch irgendwie so damit das funzt.....*vordummheitbrumm*
Bitte helft einem verblödetem Wookiee!!!

Niko 25. Jun 2003 18:31

Sorry, die Deklaration von TDatei muss ebenfalls mit in den interface-Abschnitt.

Der Quellcode in Unit1 sollte jetzt so aussehen (Auszug):
Delphi-Quellcode:
...

type
  TFilm = Record
    Filmtitel:String[50];
    Qualitaet:Byte;
    Humor:Byte;
    Spannung:Byte;
    Action:Byte;
    Medium:TCombobox;
    Datent:Byte;
  End;

  Type TDatei = File Of TFilm;
 
  TForm1 = class(TForm)
    Label1: TLabel;
    Image1: TImage;
    Image2: TImage;
    StringGrid1: TStringGrid;
    BitBtn1: TBitBtn;
    BitBtn2: TBitBtn;
    BitBtn3: TBitBtn;
    MainMenu1: TMainMenu;
    Datei: TMenuItem;
    Neu1: TMenuItem;
    SpeichernUnter1: TMenuItem;
    Speicher1: TMenuItem;
    N1: TMenuItem;
    Hilfe1: TMenuItem;
    Sortrieren1: TMenuItem;
    Kurzhilfe1: TMenuItem;
    Titel1: TMenuItem;
    Bildqualitt1: TMenuItem;
    Humor1: TMenuItem;
    Action1: TMenuItem;
    Spannung1: TMenuItem;
    Medium1: TMenuItem;
    AnzahlDatentrger1: TMenuItem;
    N2: TMenuItem;
    ArchivSchlieen1: TMenuItem;
    ProgrammBeenden1: TMenuItem;
    Ansicht: TMenuItem;
    Archiv1: TMenuItem;
    BearbeitDingBlatt1: TMenuItem;
    procedure BitBtn1Click(Sender: TObject);
    procedure BitBtn2Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure ProgrammBeenden1Click(Sender: TObject);
    procedure Archiv1Click(Sender: TObject);
    procedure BearbeitDingBlatt1Click(Sender: TObject);
    procedure ArchivSchlieen1Click(Sender: TObject);
    procedure Neu1Click(Sender: TObject);
    procedure N1Click(Sender: TObject);
  private
    { Private-Deklarationen } 
  public
    { Public-Deklarationen } 
  end;

var
  Form1: TForm1;
  Movie:TDatei;

implementation

{$R *.DFM} 

procedure TForm1.BitBtn1Click(Sender: TObject);
begin
Form1.close;
Form2.close;
end;

...

Christian Seehase 25. Jun 2003 18:32

Moin Chewbacca,

im Prinzip müsstest Du's haben:

Damit Du von beiden Units zugreifen kannst, muss es im Interfaceabschnitt stehen

Um Variablen deklarieren zu können, muss erst der Typ bekannt sein.

Chewbacca 25. Jun 2003 18:32

Kann es sein, dass ihm nicht gefällt, dass Unit1 Unit2 und Unit2 Unit1 benutzt?


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:00 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz