![]() |
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:
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:
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.
Delphi-Quellcode:
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!
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. Vielen Dank jetzt schon ma! |
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 ;-) |
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:
in den interface-Abschnitt verschieben und die selbe Deklaration in Unit2 löschen.
Var Movie:TDatei;
Übrigens würde ich auch die Deklaration von TFilm nach Unit1 verschieben. Nur der Übersicht halber... |
Und kuck mal auf meiner Homepage, da habe ich eine Klasse für typisierte Dateien geschrieben (mit Demo).
|
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! |
Moin Chewbacca,
Zitat:
Zitat:
|
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!!! |
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; ... |
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. |
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. |
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