Autor Beitrag
nl Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 18



BeitragVerfasst: Do 28.10.10 22:12 
Was bedeuten die Zahlen in den Klammern :)?

Ja bin die Crashkurse am durchgehen :)
elundril
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3747
Erhaltene Danke: 123

Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
BeitragVerfasst: 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



BeitragVerfasst: Fr 29.10.10 01:38 
Eventuell wäre noch das Tutorial von mir interessant: www.michael-puff.de/...s/Container-Klassen/
freedy
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 403
Erhaltene Danke: 1

Winows 7
Delphi XE
BeitragVerfasst: Fr 29.10.10 09:08 
user profile iconXion hat folgendes geschrieben Zum zitierten Posting springen:
Also, ich fass das von user profile iconfreedy 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 user profile iconLuckie ist wirklich gut und verständlich geschrieben. Es lohnt sich auf jeden Fall, sie wenigstens einmal zu lesen.
freedy
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 403
Erhaltene Danke: 1

Winows 7
Delphi XE
BeitragVerfasst: Mi 03.11.10 16:10 
Hallo NL,

was ist denn nun eigentlich aus deinem Projekt geworden? Bist du fertig?

Grüße
nl Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 18



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 18



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 18



BeitragVerfasst: Di 09.11.10 12:04 
user profile iconLuckie hat folgendes geschrieben Zum zitierten Posting springen:
www.michael-puff.de/...s/Container-Klassen/


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 :o
platzwart
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1054
Erhaltene Danke: 78

Win 7, Ubuntu 9.10
Delphi 2007 Pro, C++, Qt
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1054
Erhaltene Danke: 78

Win 7, Ubuntu 9.10
Delphi 2007 Pro, C++, Qt
BeitragVerfasst: Di 09.11.10 12:28 
user profile iconnl hat folgendes geschrieben Zum zitierten Posting springen:
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?


Ja, schaut gut aus, darauf kann man aufbauen. Nein, die Längenangabe ist nur die Maximallänge. Bitte hänge solch kleine Quellcodetexte nicht an, sondern poste sie direkt hier wie folgt:

ausblenden Quelltext
1:
<span class="inlineSyntax"><span class="codecomment">{PROTECTTAGf9258d87807ae2feb8b8b8274a3dbdd4}</span></span>					


Dann schaut das ganze so aus:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
type

TKarte: record
         Frage: String[10];
         Antwort: String[50];
         Uebersetzung: Boolean;
        end;

_________________
Wissenschaft schafft Wissenschaft, denn Wissenschaft ist Wissenschaft, die mit Wissen und Schaffen Wissen schafft. (myself)
nl Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 18



BeitragVerfasst: 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.


ausblenden Delphi-Quelltext
1:
test ;)					
bummi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1248
Erhaltene Danke: 187

XP - Server 2008R2
D2 - Delphi XE
BeitragVerfasst: Di 09.11.10 13:38 
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1054
Erhaltene Danke: 78

Win 7, Ubuntu 9.10
Delphi 2007 Pro, C++, Qt
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 18



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1054
Erhaltene Danke: 78

Win 7, Ubuntu 9.10
Delphi 2007 Pro, C++, Qt
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 403
Erhaltene Danke: 1

Winows 7
Delphi XE
BeitragVerfasst: 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.

ausblenden 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.

ausblenden 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.

ausblenden 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:

ausblenden 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:


ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
 
TCards = class(TCollection)
public
  constructor Create; reintroduce;  

  function Add : TCard;
end;


Und hier die Implementierung:

ausblenden 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):

ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 18



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
EE-Maler
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)
BeitragVerfasst: 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:

ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 18



BeitragVerfasst: Mi 10.11.10 13:21 
wäre dieser Aufbau jetzt in einer einzigen Unit?
elundril
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3747
Erhaltene Danke: 123

Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
BeitragVerfasst: 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.