![]() |
Zitat:
ja natürlich, hast wiedermal weiter gedacht als ich. ;) Hast natürlich recht. Schon rückg. Grüsse, Daniel :hi: |
Hallo Mr.Spock
Danke vielmals für die Hilfe, eine kleine Frage hätte ich da aber noch: Wie sollte ich die Kranktage/Urlaubstage in delphi am besten ausgeben? sowas wie ein Textfeld scheint es ja nicht zu geben, einfach in einen Label? Und gibt es die Möglichkeit 2 Forms gleichzeitig darzustellen, wobei dann im 2. nur 2 grosse textfelder wären, innerhalb denen ich die tage darstelle? Danke im Vorraus für alle Antworten. Gruss Jan |
Hallo Jan,
eine oder zwei TLabel Komponenten sind dafür hervorragend geeignet. Es wären auch TEdit Komponenten möglich, deren Eigenschaft ReadOnly auf True steht. Es ist möglich beliebig viele Fenster gleichzeitig zu öffnen. Soll das eine Fenster nur innerhalb des großen Fensters dargestellt werden können, sollte der Style des Fensters auf fsMDIChild gesetzt werden. Das Hauptfenster müsste dann vom Typ fsMDIForm sein. Das Fenster kann dann über einen Aufruf von Show angezeugt werden (nicht ShowModal). Ist es nicht gewünscht dass die beiden Fenster ineinander dargestellt werden, fügst du einfach ein neues Formular in deine Anwendung ein. Es wird dann automatisch erstellt und kann, nachdem du die beiden Labels wie gewünscht geändert hast über Show angezeigt werden. |
Hi MrSpock,
also, danke nochmal für den tip mit dem show, daran hats gelegen. Und jetzt (welch frust) hänge ich schon wieder fest. also in meinen Augen ist das Programm fertig, bis auf ein paar Schutzmechanismen um falsche Datumsangaben zu verhindern, und das Programm lässt sich auch einwandfrei kompilieren, ABER: wenn ich versuche einen einen Datensatz für eine Fehlzeit zu erstellen schmiert das Proramm mit der Verlautbarung, dass eine EAccess Violation in irgendeiner speicherstelle vorliegt ab, welches ja noch nicht sooo schlimm wäre, gäbe es da nicht ein kleines Problem. Undzwar bleibt der Programmzeiger nach dem absturz da sthen, wo ich den ID-Wert von der Karteikarte setzte. Die funktion schaut so aus:
Code:
und die Karteikarte sieht so aus:
procedure TForm2.Button1Click(Sender: TObject);
var id:integer; begin DateSeparator := '-'; ShortDateFormat := 'm/d/yyyy'; id:=4; udaten.Karte.Person:=id; //hier ist der Programmzeiger stehengeblieben udaten.Karte.von:=strtodate(form2.Edit1.Text); udaten.Karte.bis:=strtodate(form2.Edit1.Text); udaten.schreiben; showmessage('hello'); end;
Code:
Ich habe in der Funktion einfach mal eine feste Zahl genommen, um anderen Fehlern vorzubeugen.
type
TUrlaub = record Person : integer; Von : TDate; Bis : TDate; end; Kann es sein, dass integer ein nicht unterstützer Typ für Records ist? Anders kann ich mir das nämlich nicht vorstellen. Also: Plz Help a noob! MFG LANJAN |
Hallo Jan,
nein, ein Integer ist in einem Record erlaubt. Es liegt bestimmt an uDaten, wie und wo hast du diese Variable deklariert? Da du udaten.schreiben aufrufst, ist uDaten entweder ein Objekt oder eine Unit. Im ersten Fall muss es irgendo ein uDaten := TDaten.Create; oder so etwas geben. |
Hallo MrSpock,
ich habe Udaten in der unit2 über dem implementation teil definiert:
Code:
var
Form2: TForm2; anderedaten:tdatensatz; udaten:Tdatenobjekt; implementation und in der unit3 befndet sich Tdatenobjekt:
Code:
aber wie gesagt, das kompilieren funktioniert ja.. daher verstehe ich das nicht ganz.
TDatenobjekt = class(TObject)
private ps:integer; Datei:string; public Karte : TUrlaub; constructor create; procedure Schreiben; Procedure Lesen(stelle:integer); Function DateiEnde:integer; end; Gruss Jan |
Hallo Jan,
das ist es! uDaten ist ein Objekt. Irgendwann hat Borland einmal statische Objekte abgeschafft. Das bedeutet, dass
Code:
nicht den Speicher für ein Objekt mit dem Namen udaten reserviert, sondern udaten ist nur so etwas wie eine Referenz. uDaten belegt nur den Speicher für die Größe eines Zeigers. Du musst aber nicht mit udaten^ auf die Daten zugreifen, sondern kannst den Namen als Referenz auf das Objekt benutzen. ABER du musst erst Speicher reservieren und das geht mit Create. Bevor du auf die Eigenschaften oder Methoden von udaten zugreifen kannst musst du folgendes schreiben:
var
udaten:Tdatenobjekt;
Code:
Jetzt existiert das Objekt und du kannst auf seine Teile zugreifen.
udaten := Tdatenobject.Create;
|
Hallo alle,
ich bins mal wieder. hab immernoch Probleme bei diesem Programm, nachdem ich leider eine weile wegen anderer Beschäftigungen nicht weiterprogrammieren konnte. ich habe jetzt alles so programmiert wie ich meine es müsste doch alles funktionieren, aber wie es bei mir üblich ist tut es das natürlich... nicht! Also, zu meinem problem: Wer die vorherigen posts gelesen hat, der weiß worum es in meinem Programm geht. Ich habe jetzt eine procedur geschrieben um die kranktage auszulesen, und eine um sie zu speichern: Auslesen:
Code:
schreiben:
Procedure tform2.tageauslesen(id:integer);
var y,x,z:integer; begin form2.Show; form2.memo1.clear; x:=0; z:=udaten.DateiEnde; for y:=0 to z-1 do begin udaten.lesen(y); if udaten.Karte.Person=id then begin form2.memo1.lines[x]:=udaten.karte.von + udaten.karte.bis; x:=x+1; end; end; end;
Code:
(ich habe vorerst nicht den date-typ verwandt, sondern mich auf srings beschränkt um erstml damit fertig zu werden.)
procedure TForm2.Button1Click(Sender: TObject);
begin //DateSeparator := '-'; //ShortDateFormat := 'm/d/yyyy'; udaten.Karte.Person:=anderedaten.lesepos; //udaten.Karte.von:=strtodate(form2.Edit1.Text); //udaten.Karte.bis:=strtodate(form2.Edit2.Text); udaten.Karte.von:=form2.edit1.text; udaten.Karte.bis:=form2.edit2.text; udaten.schreiben; end; so, dann noch die verwendeten proceduren/funktionen: udaten.dateiende:
Code:
udaten.lesen:
function tDatenobjekt.DateiEnde:integer;
var f:File of tUrlaub; begin Datei:='c:\urlaub.ddb'; assign(f,Datei); if not fileexists('c:\Urlaub.ddb') then begin rewrite(f); close(f); end; reset(f); Dateiende:=filesize(f); close(f); end;
Code:
udaten.schreiben:
Procedure Tdatenobjekt.lesen(stelle:integer);
var f:File of tUrlaub; begin Datei:='c:\urlaub.ddb'; assign(f,Datei); reset(f); seek(f,stelle); read(f,Karte); close(f); end;
Code:
so, ich hoffe, dass da nicht an wichtigem code zum Beheben meiner Fehler fehlt.
procedure tdatenobjekt.schreiben;
var f : file of tUrlaub; begin ps:=DateiEnde; Datei:='c:\urlaub.ddb'; assign(f,Datei); reset(f); seek(f,ps); write(f,Karte); close(f); end; nun zumn auftretenden Problem: Anstatt zu der jeweils aufgerufenen Person alle abgespeicherten strings auszugeben wird nur zu der 1. Person, zu der ich etwas abgespeichert habe der 1. Eintrag ausgegeben, nicht mehr und nicht weniger. habe ich da etwas mit den indexen falsch gemacht? was mir aufgefallen ist: wenn ich die typisierte Datei öffne, in welcher die Kranktage abgespeichert werden, so finde ich die date-strings alle korrekt abgespeichert, nur die zahl des users, zu welchem diese daten gehören wird nicht abgespeichert, stattdessen steht ein "gh" hinter dem 1. datum eines jeden Eintrags, kann das irgendetwas damit zu tun haben? Nun ja, ich stehe vor einem Rätsel und vorallem Termindruck *auweia*. Naja, hoping 4 Help. euer Jan |
Hallo Jan,
hier ein paar Kommentare: 1. Du solltest einem Memo nur Daten über
Code:
hinzufügen. Der Versuch direkt auf Lines zuzugreifen ist sehr gefährlich, weil ein Memo zunächst einmal gar keine Lines hat. :mrgreen: Mit jedem Add addierst du eine Zeile. Danach kannst du auf den n-ten Eintrag über Lines[n-1] zugreifen, aber erst dann!
Memo1.Lines.Add(...);
2. Beim Schreiben ist die Kernzeile des möglichen Problems:
Code:
Woher kommt und was ist anderedaten.lesepos?
udaten.Karte.Person:=anderedaten.lesepos;
3. Da du ja gar keinen Index angelegt hast, musst du die Datei sequentiell durchlaufen:
Code:
Ein Index ist eine Tabelle, in der die Zuordnung von IDs und zugehöriger Satznummer in der Datei abgelegt wäre. Z.B. ID 5 steht an Stelle 17 in der Datei. Hättest du diese Info, könntest du einfach den 17. Satz lesen und hättest den Datensatz zu Person 5. In deinem Fall ist aber ein sequentieller Durchlauf wie oben beschrieben sinnvoll.
Datei:='c:\urlaub.ddb';
assign(f,Datei); reset(f); while not EOF(f) do begin read(f, satz); if satz.ID = gesuchteID then .... end; So das war's zunächst für heute. |
Hallo MrSpock,
also zu deinen Fragen: Zitat:
Code:
Das bedarf glaube ich einiger Erklärung:
function tDatensatz.LesePos:integer;
begin LesePos:= pos; end; Diese Funktion ist aus einer anderen unit und gehört zu dem Objekt, welches für die verwaltung meiner personaldatenbank zuständig ist. Die Variable pos ist ein Zeiger für die derzeitige Personalkarte auf die im Moment zugegriffen wird. Jetzt lag es mir nah, einfach die Variable pos als festen Wert für eine Person zu benutzen, weil ja jede Person einen eindeutig zugewiesenen pos-wert hat, nämlich jeweils seine eigene Karteikartennummer. Durch anderedaten.lesepos versuche ich jetzt die derzeitige Position der Personaldatenbank auszulesen und lese/schreibe dann die zu dieser Person gehörenden Kranktage, wobei ich den durch anderedaten.lesepos ausgelesenen Wert weiterverwend und als "Personenkürzel" weiterverwende. Soviel dazu. *Zungeentknot* Der Tipp mit dem memo feld ist Gold Wert, vielen Dank! Allerdings verstehe ich nicht warum du mich darauf hinweist, dass ich die typisierte datei sequentiell auslesen solle, genau das habe ich doch gemacht. hier:
Code:
Weiterhin vielen Dank für jegliche Hilfestellung.
Procedure tform2.tageauslesen(id:integer);
var y,x,z:integer; begin form2.Show; form2.memo1.clear; x:=0; z:=udaten.DateiEnde; for y:=0 to z-1 do begin udaten.lesen(y); if udaten.Karte.Person=id then begin form2.memo1.lines.add(udaten.karte.von + udaten.karte.bis); x:=x+1; end; end; end; mfg Jan |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:07 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