Autor |
Beitrag |
nl 
      
Beiträge: 18
|
Verfasst: Do 28.10.10 22:12
Was bedeuten die Zahlen in den Klammern  ?
Ja bin die Crashkurse am durchgehen 
|
|
elundril
      
Beiträge: 3747
Erhaltene Danke: 123
Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
|
Verfasst: Do 28.10.10 22:15
Das ist die Länge des Strings. Damit man Strings auch in typisierten Daten speichern kann, muss man ihnen eine fixe Länge zuweisen (eben durch die zahlen in den Klammern).
lg elundril
_________________ This Signature-Space is intentionally left blank.
Bei Beschwerden, bitte den Beschwerdebutton (gekennzeichnet mit PN) verwenden.
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Fr 29.10.10 01:38
Eventuell wäre noch das Tutorial von mir interessant: www.michael-puff.de/...s/Container-Klassen/
|
|
freedy
      
Beiträge: 403
Erhaltene Danke: 1
Winows 7
Delphi XE
|
Verfasst: Fr 29.10.10 09:08
Xion hat folgendes geschrieben : | Also, ich fass das von freedy nochmal zusammen *schlagt mich wenns falsch ist*
|
muss dich nicht schlagen
Es hat mich doch irgendwie nicht losgelassen. Google spuckte mir folgende Seite aus: oszhdl.be.schule.de/...matik/delphi/mvc.htm
Nur, falls es noch jemanden interessiert.
Die Beschreibung der Container-Klassen von Luckie ist wirklich gut und verständlich geschrieben. Es lohnt sich auf jeden Fall, sie wenigstens einmal zu lesen.
|
|
freedy
      
Beiträge: 403
Erhaltene Danke: 1
Winows 7
Delphi XE
|
Verfasst: Mi 03.11.10 16:10
Hallo NL,
was ist denn nun eigentlich aus deinem Projekt geworden? Bist du fertig?
Grüße
|
|
nl 
      
Beiträge: 18
|
Verfasst: Mi 03.11.10 18:45
Sorry habe zur Zeit viel zu tun.
Habe wenn ich Zeit hatte paar Crashkurse durchgearbeitet, melde mich demnächst mochmal wenn ich wieder mehr Zeit habe.
Danke.
|
|
nl 
      
Beiträge: 18
|
Verfasst: Di 09.11.10 11:48
Hallo wiedereinmal,
hatte wenig Zeit und konnte deswegen kaum weiter arbeiten.
Muss die vorgegebene Länge exakt mit der des Strings entsprechen?
Habe mal was angefügt...wäre das so einigermaßen richtig?
Einloggen, um Attachments anzusehen!
|
|
nl 
      
Beiträge: 18
|
Verfasst: Di 09.11.10 12:04
Bin ich mal durchgegangen, wäre doch eigtl auch relativ sinnvoll bei meiner Aufgabe oder?
Leider versteh ich viele sachen nicht...Woher weiß denn das Progamm "was" die Karte denn überhaupt für einen Wert oder sonstiges bekommt bei "FCards.Add(Card);" und was "function GetItem(Index: Integer): TCard;
procedure SetItem(Index: Integer; const Value: TCard);"
bewirkt weiß ich auch nicht 
|
|
platzwart
      
Beiträge: 1054
Erhaltene Danke: 78
Win 7, Ubuntu 9.10
Delphi 2007 Pro, C++, Qt
|
Verfasst: Di 09.11.10 12:22
Ohne mir den Quelltext anzuschaun, würde ich das wie folgt interpretieren:
function GetItem(Index: Integer): TCard;
Du willst eine Karte vom Stapel haben, nämlich die an der Position 'Index'. Es wird eine Karte des Typs TCard zurückgegeben ('function' gibt immer etwas zurück).
procedure SetItem(Index: Integer; const Value: TCard);
Du willst eine Karte dem Stapel hinzufügen. Es handelt sich dabei um die Karte 'Value' vom Typ TCard. Die Karte wird an die Position 'Index' gelegt ('procedure' geben nie etwas zurück).
FCards.Add(Card);
Fügt dem internen Kartenstapel die Karte 'Card' hinzu.
_________________ Wissenschaft schafft Wissenschaft, denn Wissenschaft ist Wissenschaft, die mit Wissen und Schaffen Wissen schafft. (myself)
|
|
platzwart
      
Beiträge: 1054
Erhaltene Danke: 78
Win 7, Ubuntu 9.10
Delphi 2007 Pro, C++, Qt
|
Verfasst: Di 09.11.10 12:28
_________________ Wissenschaft schafft Wissenschaft, denn Wissenschaft ist Wissenschaft, die mit Wissen und Schaffen Wissen schafft. (myself)
|
|
nl 
      
Beiträge: 18
|
Verfasst: Di 09.11.10 12:50
Okay gut. Also wäre das jetzt quasi eine meiner Karten.
Meine nächste Frage wäre dann, wie ich Frage, bzw Antwort etw. zuweisen kann, habe ja noch nie mit "record's" gearbeitet.
Delphi-Quelltext
|
|
bummi
      
Beiträge: 1248
Erhaltene Danke: 187
XP - Server 2008R2
D2 - Delphi XE
|
Verfasst: Di 09.11.10 13:38
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| type TKartenArray=Arry of TKarte; private FKartenArray:TKartenArray; .... begin Setlength(FKartenArray,10);
FKartenArray[0].Frage := '1. Frage'; FKartenArray[0].Antwort := '1. Antwort'; ... FKartenArray[9].Frage := '10. Frage'; FKartenArray[9].Antwort := '10. Antwort'; ... |
_________________ Das Problem liegt üblicherweise zwischen den Ohren H₂♂
DRY DRY KISS
|
|
platzwart
      
Beiträge: 1054
Erhaltene Danke: 78
Win 7, Ubuntu 9.10
Delphi 2007 Pro, C++, Qt
|
Verfasst: Di 09.11.10 13:47
Du solltest jedoch beachten, dass der Teil von SetItem/GetItem OOP ist, die Array/Record Geschichte jedoch nicht, es sind also zwei verschiedene herangehensweisen.
_________________ Wissenschaft schafft Wissenschaft, denn Wissenschaft ist Wissenschaft, die mit Wissen und Schaffen Wissen schafft. (myself)
|
|
nl 
      
Beiträge: 18
|
Verfasst: Di 09.11.10 17:07
Ja ich denke das ist okay, der Lehrer hat ja selbst Arrays für den "Verwalter" vorgeschlagen.
Noch eine Frage, wenn ich das nun mit einem "Verwalter", den einzelnen Karten und dem "Kartenstapel" machen will, wie realisier ich das?
weil so wären ja die Karten im "Kartenstapel" deklariert oder?
|
|
platzwart
      
Beiträge: 1054
Erhaltene Danke: 78
Win 7, Ubuntu 9.10
Delphi 2007 Pro, C++, Qt
|
Verfasst: Di 09.11.10 17:23
Ehm... ne... Du erstellst ein Record. Dieses Record ist der Prototyp deiner Karten, also nur die Beschreibung, wie eine Karte ausschaun soll, aber es ist keine Karte an sich. Darüberhinaus musst du separat den "Verwalter" anlegen, der ist unabhängig von den Karten an sich. Der nimmt die Karten auf (Array of TKarte...) und besitzt so Methoden wie z.B. 'KarteEinfügen(Index, Karte)', 'KarteLöschen(Index)', 'KarteZiehen: Karte'.
_________________ Wissenschaft schafft Wissenschaft, denn Wissenschaft ist Wissenschaft, die mit Wissen und Schaffen Wissen schafft. (myself)
|
|
freedy
      
Beiträge: 403
Erhaltene Danke: 1
Winows 7
Delphi XE
|
Verfasst: Di 09.11.10 17:49
Hallo NL,
alternativ könntest du folgendes machen.
Du baust dir eine Collection. Das ist eine Klasse, die die Fähigkeit hat, eine beliebige (je nach Speicher) Menge von anderen Objekten zu verwalten. Das solltest du in dem Tutorial von Luckie gelesen haben. Dann ist allerdings jede Karte ein Objekt. Das macht aber nichts, denn dadurch gewinnst du mehr Möglichkeiten.
Das Ganze funktioniert dann so:
1. Du erzeugst dir eine Klasse TCard. Diese ist die Beschreibung für eine Karte.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| TCard = class(TCollectionItem) private FFrage : String; FAntwort : String; public function Prüfe(BenutzerAntwort : String) : Boolean; property Frage : String read FFrage write FFrage; property Antwort : String read FAntwort write FAntwort; end; |
2. Du erzeugst dir eine Klasse TCards. Diese sammelt alle deine Karten. Um die Klasse TCollection nutzen zu können, musst du "Classes" in die Uses aufnehmen, wenn noch nicht geschehen.
Delphi-Quelltext 1: 2: 3:
| TCards = class(TCollection) end; |
Deine Klasse TCard sieht nun fast genauso aus, wie dein Record. Allerdings bist du hier nicht auf Längen beschränkt (das, was du vorher in den eckigen Klammern schreiben musstest).
3. Wir müssen der Klasse TCards nun mitteilen, welchen Typ sie verwalten soll. Sie hat, wie jede andere Klasse einen Konstruktor. Diesen "klauen" wir uns jetzt und überschreiben ihn.
Delphi-Quelltext 1: 2: 3: 4: 5:
| TCards = class(TCollection) public constructor Create; reintroduce; end; |
Das reintroduce bedeutet eigentlich nicht mehr, als dass die Methode neu eingeführt wird, obwohl sie bereits vorhanden ist.
4. In der Implementierung schreibst du nun folgendes:
Delphi-Quelltext 1: 2: 3: 4: 5:
| constructor TCards.Create; begin inherited Create(TCard); end; |
Die Zeile "Inherited Create" ruft nun die alte Methode Create auf und sagt der Collection, dass sie nun die Klassen vom Typ TCard verwalten soll.
5. Als nächstes brauchen wir eine Methode, um eine neue Karte anzulegen. Dazu erweitern wir die Klasse TCards um eine Funktion Add. Deine Klasse sollte jetzt so aussehen:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7:
| TCards = class(TCollection) public constructor Create; reintroduce;
function Add : TCard; end; |
Und hier die Implementierung:
Delphi-Quelltext 1: 2: 3: 4: 5:
| function TCards.Add : TCard; begin Result := TCard(inherited Add); end; |
6. So weit, so gut. Du bist jetzt sicherlich gespannt, ob das schon so funktioniert. Testen wir es:
Baue in ein Formular einfach eine Variable in den Public-Bereich ein "Cards : TCards;". Im FormCreate (s. Ereignisse des Formulars, ggf. Suche) kannst du dann die Instanz anlegen. Dazu musst du dort nur folgende Zeile einfügen "Cards := TCards.Create;". Im FormDestroy solltest du, damit es sauber programmiert ist, das Objekt auch wieder mit "Cards.Free" bzw. "FreeAndNil(Cards);" freigeben.
Jetzt können wir erstmal einen Button und ein Label auf das Forumlar legen. Das OnClick-Ereignis des Buttons sollte den folgenden Quelltext enthalten (ggf. anpassen):
Delphi-Quelltext 1: 2:
| Cards.Add; Label1.Caption := 'Cards enthält ' + IntToStr(Cards.Count) + ' Karten.'; |
Magst du das erst einmal probieren? Der Rest ist dann sehr einfach.
Grüße
|
|
nl 
      
Beiträge: 18
|
Verfasst: Mi 10.11.10 13:15
property Frage : String read FFrage write FFrage;
property Antwort : String read FAntwort write FAntwort;
kann mir evtl jemand diese Zeile erklären?
|
|
Xion
      

Beiträge: 1952
Erhaltene Danke: 128
Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
|
Verfasst: Mi 10.11.10 13:19
Eine "property" ist ein Attribut zu Deutsch. In Delphi hat man den Luxus, dass man keine Getter und Setter schreiben muss, sondern (obwohl die Variable eigentlich private ist) trotzdem "direkt" darauf zugreifen kann, wenn man keine Getter/Setter-Funktionen benötigt.
Im Wesentlichen heißt es:
Wenn du "Frage" lesen willst, dann geb ich dir den Inhalt aus "FFrage"
Wenn du "Frage" schreiben willst, dann schreib ich das in "FFrage"
Man könnte in diesem Beispiel FFrage auch einfach public machen. Allerdings ist es so leicht abänderbar:
Delphi-Quelltext 1: 2: 3: 4: 5: 6:
| property Frage : String read FFrage write SetFrage;
procedure SetFrage(V: String); begin FFrage:='Bla'+V; end; |
So würde immer, wenn du in Frage was schreibst, erst noch "Bla" davor gehängt.
_________________ a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)
|
|
nl 
      
Beiträge: 18
|
Verfasst: Mi 10.11.10 13:21
wäre dieser Aufbau jetzt in einer einzigen Unit?
|
|
elundril
      
Beiträge: 3747
Erhaltene Danke: 123
Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
|
Verfasst: Mi 10.11.10 13:23
Du könntest es alles in eine Unit schreiben. Delphi verträgt auch mehrere Klassen in einer Unit.
lg elundril
_________________ This Signature-Space is intentionally left blank.
Bei Beschwerden, bitte den Beschwerdebutton (gekennzeichnet mit PN) verwenden.
|
|