AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi verlinkte datenbank, ohne feste karteikartengröße
Thema durchsuchen
Ansicht
Themen-Optionen

verlinkte datenbank, ohne feste karteikartengröße

Ein Thema von Jan · begonnen am 24. Sep 2002 · letzter Beitrag vom 23. Okt 2002
Antwort Antwort
Seite 2 von 5     12 34     Letzte »    
Daniel B
(Gast)

n/a Beiträge
 
#11
  Alt 27. Sep 2002, 17:51
Zitat von MrSpock haute allwissend in die Tasten und:
@Daniel B: Ich hatte PLZ größer als 5 angenommen, damit man ggf. auch ein Länderkennzeichen davor setzen kann. Z.B. CS-1000 oder A-12345, etc.
Hi, MrSpock,

ja natürlich, hast wiedermal weiter gedacht als ich. Hast natürlich recht. Schon rückg.

Grüsse, Daniel
  Mit Zitat antworten Zitat
Benutzerbild von Jan
Jan

Registriert seit: 24. Sep 2002
Ort: Magdeburg
491 Beiträge
 
Delphi 7 Enterprise
 
#12
  Alt 1. Okt 2002, 01:35
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
Jan
Wenn die Sonne der Kultur tief steht, werfen auch kleine Gestalten lange Schatten.
  Mit Zitat antworten Zitat
Benutzerbild von MrSpock
MrSpock
(Co-Admin)

Registriert seit: 7. Jun 2002
Ort: Owingen
5.865 Beiträge
 
Delphi 2010 Professional
 
#13
  Alt 1. Okt 2002, 07:47
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.
Albert
Live long and prosper


MrSpock
  Mit Zitat antworten Zitat
Benutzerbild von Jan
Jan

Registriert seit: 24. Sep 2002
Ort: Magdeburg
491 Beiträge
 
Delphi 7 Enterprise
 
#14
  Alt 2. Okt 2002, 15:36
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:
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;
und die Karteikarte sieht so aus:

Code:
type
  TUrlaub = record
    Person   : integer;
    Von      : TDate;
    Bis      : TDate;
  end;
Ich habe in der Funktion einfach mal eine feste Zahl genommen, um anderen Fehlern vorzubeugen.
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
Jan
Wenn die Sonne der Kultur tief steht, werfen auch kleine Gestalten lange Schatten.
  Mit Zitat antworten Zitat
Benutzerbild von MrSpock
MrSpock
(Co-Admin)

Registriert seit: 7. Jun 2002
Ort: Owingen
5.865 Beiträge
 
Delphi 2010 Professional
 
#15
  Alt 2. Okt 2002, 16:04
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.
Albert
Live long and prosper


MrSpock
  Mit Zitat antworten Zitat
Benutzerbild von Jan
Jan

Registriert seit: 24. Sep 2002
Ort: Magdeburg
491 Beiträge
 
Delphi 7 Enterprise
 
#16
  Alt 2. Okt 2002, 17:14
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:
    TDatenobjekt = class(TObject)
                      private
                            ps:integer;
                            Datei:string;
                      public
                            Karte : TUrlaub;
                            constructor create;
                            procedure Schreiben;
                            Procedure Lesen(stelle:integer);
                            Function DateiEnde:integer;
                          end;
aber wie gesagt, das kompilieren funktioniert ja.. daher verstehe ich das nicht ganz.
Gruss
Jan
Jan
Wenn die Sonne der Kultur tief steht, werfen auch kleine Gestalten lange Schatten.
  Mit Zitat antworten Zitat
Benutzerbild von MrSpock
MrSpock
(Co-Admin)

Registriert seit: 7. Jun 2002
Ort: Owingen
5.865 Beiträge
 
Delphi 2010 Professional
 
#17
  Alt 2. Okt 2002, 21:12
Hallo Jan,

das ist es! uDaten ist ein Objekt. Irgendwann hat Borland einmal statische Objekte abgeschafft. Das bedeutet, dass

Code:
var
  udaten:Tdatenobjekt;
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:

Code:
  udaten := Tdatenobject.Create;
Jetzt existiert das Objekt und du kannst auf seine Teile zugreifen.
Albert
Live long and prosper


MrSpock
  Mit Zitat antworten Zitat
Benutzerbild von Jan
Jan

Registriert seit: 24. Sep 2002
Ort: Magdeburg
491 Beiträge
 
Delphi 7 Enterprise
 
#18
  Alt 16. Okt 2002, 19:14
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:
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;
schreiben:
Code:
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;
(ich habe vorerst nicht den date-typ verwandt, sondern mich auf srings beschränkt um erstml damit fertig zu werden.)

so, dann noch die verwendeten proceduren/funktionen:
udaten.dateiende:
Code:
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;
udaten.lesen:
Code:
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;
udaten.schreiben:
Code:
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;
so, ich hoffe, dass da nicht an wichtigem code zum Beheben meiner Fehler fehlt.
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
Jan
Wenn die Sonne der Kultur tief steht, werfen auch kleine Gestalten lange Schatten.
  Mit Zitat antworten Zitat
Benutzerbild von MrSpock
MrSpock
(Co-Admin)

Registriert seit: 7. Jun 2002
Ort: Owingen
5.865 Beiträge
 
Delphi 2010 Professional
 
#19
  Alt 16. Okt 2002, 21:00
Hallo Jan,

hier ein paar Kommentare:

1. Du solltest einem Memo nur Daten über

Code:
Memo1.Lines.Add(...);
hinzufügen. Der Versuch direkt auf Lines zuzugreifen ist sehr gefährlich, weil ein Memo zunächst einmal gar keine Lines hat. Mit jedem Add addierst du eine Zeile. Danach kannst du auf den n-ten Eintrag über Lines[n-1] zugreifen, aber erst dann!

2. Beim Schreiben ist die Kernzeile des möglichen Problems:

Code:
udaten.Karte.Person:=anderedaten.lesepos;
Woher kommt und was ist anderedaten.lesepos?

3. Da du ja gar keinen Index angelegt hast, musst du die Datei sequentiell durchlaufen:

Code:
Datei:='c:\urlaub.ddb';
  assign(f,Datei);
  reset(f);
  while not EOF(f) do
  begin
    read(f, satz);
    if satz.ID = gesuchteID then
     ....
  end;
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.

So das war's zunächst für heute.
Albert
Live long and prosper


MrSpock
  Mit Zitat antworten Zitat
Benutzerbild von Jan
Jan

Registriert seit: 24. Sep 2002
Ort: Magdeburg
491 Beiträge
 
Delphi 7 Enterprise
 
#20
  Alt 16. Okt 2002, 23:08
Hallo MrSpock,
also zu deinen Fragen:

Zitat:
Woher kommt und was ist anderedaten.lesepos?
Code:
function tDatensatz.LesePos:integer;
begin
        LesePos:= pos;
end;
Das bedarf glaube ich einiger Erklärung:
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:
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;
Weiterhin vielen Dank für jegliche Hilfestellung.

mfg
Jan
Jan
Wenn die Sonne der Kultur tief steht, werfen auch kleine Gestalten lange Schatten.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 5     12 34     Letzte »    


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:38 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