Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - Records Basiswissen
Grimsch - Do 03.09.09 06:44
Titel: Records Basiswissen
Moin moin ;)
ich habe da ein Problem bezüglich Records in Delphi... und zwar muss ich mir bis nächste Woche die Grundstruktur von Records selbst beigebracht haben und dies mit einem kleinen Programm vorstellen.
Mein Problem dabei ist, dass ich zwar schon weiß was Records sind usw. aber nirgends im Internet gefunden habe wie man ein ganz einfaches und simples Programm erstellt. Desweiteren hab ich auch nirgends Quelltexte gefunden, welche Verknüpfungen mit Buttons, Panels usw beinhalten. Also ganz kurz und knapp: Ich weiß nicht wie ich einen Record zum "Laufen" bringe.
Würde mich über Eure Hilfe sehr freuen!
MfG
Nersgatt - Do 03.09.09 07:39
Der Klassiker für eine Records-Beispielanwendung ist wohl eine Mini-Adressverwaltung.
Mach Dir einen Record, der die Daten enthält (Name, Vorname, Straße, etc). Und speichere diese Records in einem Array.
zuma - Do 03.09.09 11:06
1) Record definieren
Delphi-Quelltext
1: 2: 3: 4: 5:
| TMyRecord = record Feld1 : Datentyp; Feld2 : Datentyp; usw. end; |
2) Record verwenden
Delphi-Quelltext
1: 2: 3: 4: 5: 6:
| var MyRecord : TMyRecord; begin MyRecord.Feld1 := Wert; Wert := MyRecord.Feld1; |
den Rest darfst du dir selber erarbeiten ;)
Grimsch - Do 03.09.09 12:18
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35:
| unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs;
type TForm1 = class(TForm) private public end; type Tschueler = record name: string; nummer:integer; end;
var Form1: TForm1; schueler: Tschueler;
implementation
{$R *.dfm}
begin schueler.name:= 'Peter'; Peter:= schueler.name;
end. |
erstmal danke für die schnelle antwort aber noch fehlt mir da irgendwie etwas.
1. ich weiß noch nicht genau wie ich die reihenfolge machen soll. ist sie soweit in ordnung?
2. die zeile Peter:= ... da wird mir peter als undeclared identifier angezeigt, da ich diesen ja nicht als variable angegeben habe. Außerdem ist das ganze auch wenn es funktioniert doch nichts weiter als quelltext, welcher nichts mit der oberfläche macht zB durch buttonklick die daten in edits wiederzugeben.
Soetwas würde ich gerne machen können
Delete - Do 03.09.09 12:24
Was die Zeile mit der Zuweisung an Peter bewirken soll, entzieht sich meinem Verständnis. Aber zu den Edits: Du hast ja in Deinem Record mehrere verschiedene Datenfelder (Name und Nummer). Um diese nun auszugeben, musst Du sie doch nur abfragen (ähnlich den Properties einer Klasse).
Delphi-Quelltext
1: 2: 3: 4: 5:
| procedure TDeinForm.ButtonZeigenClick(Sender: TObject); begin edtName.Text := schueler.Name; edtNummer.Text := IntToStr(schueler.Nummer); end; |
So einfach ist das im Prinzip, zumal Du derzeit ja nur einen einzigen Record hast.
Grimsch - Do 03.09.09 12:24
Nersgatt hat folgendes geschrieben : |
Der Klassiker für eine Records-Beispielanwendung ist wohl eine Mini-Adressverwaltung.
Mach Dir einen Record, der die Daten enthält (Name, Vorname, Straße, etc). Und speichere diese Records in einem Array. |
Gibt es denn nichts ohne Array? Unser Kurs wurde in verschiedene Arbeitsgruppen unterteilt. Wir sollen records bearbeiten, während eine andere Gruppe Arrays bearbeitet, also beides sogesagt distanziert voneinander.
Nersgatt - Do 03.09.09 12:30
Naja, wenn man eine Adressverwaltung möchte, dann muss man ja die Daten in irgendeiner Listenform halten. Da drängt sich für die Anfänger das Array geradezu auf. Es klingt für mich so, als würde euerer Lehrer gar nicht verlangen, dass ihr so tief einsteigt, sondern eher, dass er das Ziel verfolgt, hinterher das Wissen der beiden Arbeitsgruppen zu verknüpfen.
Also mach ein ganz simples Recordbeispiel (z.B. mit nur einer Adresse), ohne die Daten irgendwie listenmäßig zu speichern.
Grimsch - Do 03.09.09 12:45
DeddyH hat folgendes geschrieben : |
Delphi-Quelltext 1: 2: 3: 4: 5:
| procedure TDeinForm.ButtonZeigenClick(Sender: TObject); begin edtName.Text := schueler.Name; edtNummer.Text := IntToStr(schueler.Nummer); end; |
|
wenn ich dies nun so bei mir eingebe erscheint die Fehlermeldung, dass edtName nicht definiert ist. Was nun?^^ Und was hat das edt für eine bedeutung?
Regan - Do 03.09.09 12:53
Ich würde dir erstmal
Komplexe Datentypen im DT [
http://www.delphi-treff.de/sprachen/object-pascal/komplexe-datentypen/] vorschlagen.
Grimsch hat folgendes geschrieben : |
| wenn ich dies nun so bei mir eingebe erscheint die Fehlermeldung, dass edtName nicht definiert ist. Was nun?^^ Und was hat das edt für eine bedeutung? |
Wenn man Komponenten auf das Formular zieht, sollte man diese (der Übersichtlichkeit halber) einheitlich umbenennen. So besteht der Name (nicht der Text oder Caption) einer Komponente meistens aus zwei Teilen:
| Zitat: |
| <Präfix><Verwendung> |
Wenn du also ein Editfeld hast, dann könnte das Editfeld eben:
edtName oder
edName statt
Edit1 heißen. Damit weißt du im Quelltext sofort, dass es sich um ein Eingabefeld handelt, in dem der Name stehen soll.
Grimsch - Do 03.09.09 13:06
ah ok danke
habe nun auch immerhin schon eine gewisse idee wie ich das machen kann aber hab immernoch ein problem und zwar folgenede:
Delphi-Quelltext
1: 2: 3: 4: 5: 6:
| procedure TForm1.Button1Click(Sender: TObject); begin edit1.text:= schueler.name; edit2.text:=IntToStr(schueler.nummer);
end; |
hiermit werden ja die daten aus den Edits eingelesen. Nun habe ich vor sie in 2 Labels wieder auszugeben nur weiß ich nicht genau wie.
Mein ansatz war:
Delphi-Quelltext
1: 2:
| schueler.name:= label1.caption; schueler.nummer:= label2.caption; |
allerdings funktioniert das auch nicht. ich weiß mir fehlen so einige grundkenntnisse >.<
Delete - Do 03.09.09 13:14
"Funktioniert nicht" ist keine Fehlerbeschreibung. Aber die Nummer ist eine integer, der kannst Du keinen String direkt zuweisen, sondern musst ihn zuerst in eine Zahl wandeln.
zuma - Do 03.09.09 13:17
Zuweisen und lesen machst du genau falsch rum ;)
Zuweisung an Edit (und lesen aus Recordfeld)
Delphi-Quelltext
1:
| Edit1.Text := Schueler.name; |
Lesen aus Edit (und zuweisen an Recordfeld)
Delphi-Quelltext
1:
| Schueler.name =:= Edit.Text; |
Dude566 - Do 03.09.09 14:54
Grimsch hat folgendes geschrieben : |
Nersgatt hat folgendes geschrieben : | Der Klassiker für eine Records-Beispielanwendung ist wohl eine Mini-Adressverwaltung.
Mach Dir einen Record, der die Daten enthält (Name, Vorname, Straße, etc). Und speichere diese Records in einem Array. |
Gibt es denn nichts ohne Array? Unser Kurs wurde in verschiedene Arbeitsgruppen unterteilt. Wir sollen records bearbeiten, während eine andere Gruppe Arrays bearbeitet, also beides sogesagt distanziert voneinander. |
Naja ist halt sinnvoll wenn man auch etwas verwendet (Arrays) wo man mehrere Werte abspeichert wenn man records verwendet, als nur einzelne Variablen o.ä.
Dann bräuchtest du ja keinen record sondern kannst die Daten direkt in Variable speichern oder ausgeben.
Grimsch - Do 03.09.09 14:55
ah ok super vielen dank nu funktioniert das erste kleine programm ;)
werde die nächsten tage bestimmt noch ein paar fragen haben aber vorerst bin ich zufrieden :P hätte nicht gedacht, dass mir in einem forum so geholfen werden kann =)
allerdings was mich stutzig macht ist folgendes:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25:
| type Tschueler = record name: String; nummer: string; end; var Form1: TForm1; schueler: Tschueler; implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject); begin schueler.name:= edit1.Text; schueler.nummer:= edit2.text; end;
procedure TForm1.Button2Click(Sender: TObject); begin label1.Caption:= schueler.name; label2.Caption:=schueler.nummer; end;
end. |
ich habe oben anstatt nummer: integer nun nummer: string geschrieben aber es funktioniert trotzdem :O könnte sich da später ein fehler einschleichen? oder kann ich es so lassen? ansonsten hätte ich gegen einen anderen lösungsvorschlag nichts einzuwenden :P
Dude566 - Do 03.09.09 14:57
Gerne wieder neue Fragen, aber immer wieder in einem neuen Thread. ;)
Tilman - Do 03.09.09 15:31
Naja es passt ja zum Topic, daher beantworte ich die Frage mal ^^
Also Strings im Record sind kein Problem, allerdings muss man wissen dass Strings eigentlich nur aus einer Adresse im Speicher bestehen (Wo dann der String liegt). Daher kann man ein solches Record nicht abspeichern.
So lange du aber nicht in Dateien schreibst kannst du das so machen.
Delete - Do 03.09.09 16:00
Wenn die Nummer wirklich nummerisch ist, sollte man auch einen passenden Typ nehmen. Allerdings muss man dann bei der Ein- bzw. Ausgabe hin- und herkonvertieren (IntToStr, TryStrToInt), aber das ist ja kein großartiges Hindernis.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!