![]() |
Delphi-Version: 5
TCollection & TCollectionitem Tutorial
Hi, ich studiere Informatik und mache derzeit mein Praxissemester. Ich hab in meiner Arbeit vor paar Tagen angefangen Delphi zu lernen. Meine neue Aufgabe ist es jetzt, eine TCollection zu erstellen und TCollectionitems einzufügen und zu updaten. Die Add Methode habe ich bereits geschafft, nur leider finde ich nirgends etwas wie die Update/Change Methode funktioniert. Hätte vielleicht jemand ein Beispiel oder ein Gutes Tutorial indem ich dem ganzen Thema etwas näher komme. Ich habe mir bereits ein Buch ausgehliehen und das Internet durchsucht doch bis jetzt leider erfolglos.
Danke schon mal im voraus :) |
AW: TCollection & TCollectionitem Tutorial
Hallo und Herzlich Willkommen in den Heiligen Hallen des Wissens und des Wahnsinns :love:
Was bedeutet "die Add()-Methode geschafft"? Die ersten zwei Google-Treffer zu "TCollectionItem" (oder die F1-Taste in deinem Delphi) sagen eigentlich alles zur Verwendung der Klasse. Hast du eine konkrete praxisnahe Aufgabenstellung? Sollst du für irgendwas eine Ableitung von
Delphi-Quellcode:
bzw
TCollection
Delphi-Quellcode:
erstellen?
TCollectionItem
Soweit du nicht die kostenlose Starter-Edition verwendest ist eigentlich auch der gesamte Quelltext der Grundbibliothek dabei - Du kannst dir also die Implementierung von z.B.
Delphi-Quellcode:
anschauen.
TCollection.Add()
|
AW: TCollection & TCollectionitem Tutorial
Vielleicht findest Du hier noch ein paar Hinweise:
![]() Da ging es mir aber eher um einen Komponenteneditor. (Ich habe sogar das Video noch in einem Backup gefunden, jetzt aber nicht nochmal reingesehen. Weiß nicht, ob es wirklich etwas bringt.) TCollection ist für den Anfang schon etwas schwieriger. Also nicht verzagen, wenn Du einige Zeit damit zubringst. PS: Schreib mal noch Deine Delphi-Version ins Profil. So kann man genauer helfen. |
AW: TCollection & TCollectionitem Tutorial
Danke für eure Antworten.
Ich arbeite mit embarcadero und delphi 5. Die konkrete Aufgabe lautet: A component that organized Tür Threads ans their outputs a:Use TCollection with its methods "Changed" and "Update ". Ich habe bereits eine Class von TCollection und Tcollectionitem erstellt. Und mit der Add() Methode kann ich auch Sachen einfügen, nur finde ich nirgends Beispiele oder Hilfe wie ich z.b die Update () Methode implementiere. |
AW: TCollection & TCollectionitem Tutorial
Embarcadero ist die Firma, zu der Delphi jetzt gehört.
Delphi 5 stammt noch aus Zeiten als du noch im Sandkasten gespielt hast und gehörte damals der Firma Borland. Meinst du vielleicht Delphi XE5? Im Zweifel mach mal ein Screenshot von der IDE und stelle ihn hier ein. Zu deiner Frage: ![]() In der Doku gibt es eine Tabelle. Hier werden Nachkommen von TCollection aufgezählt, die schon so im Framework drin sind. Suche diese Klassen in ihren entsprechenden Units und schaue dort nach, wie dort Update definiert ist. Wenn deine Frage eigentlich lautet: Wie kann ich abstrakte oder virtuelle Methoden in der abgeleiteten Klasse überschreiben? Dann ist die Antwort darauf: Das override; Schlüsselwort hinter der eigenen Methode hinschreiben. |
AW: TCollection & TCollectionitem Tutorial
Ja genau, Delphi XE5.
Okay danke, dann schau ich mir das jetzt mal an. Eine spezielle Frage habe ich eigentlich gar nicht, ich bin mehr auf der Suche nach einem guten Tutorial oder einer Erklärung um für das ganze Thema ein besseres Verständnis zu bekommen |
AW: TCollection & TCollectionitem Tutorial
Naja, es ist eine Liste zu der man Items hinzufügen kann. Nicht wirklich was neues. Das müsste dir im Studium in Java oder C# doch schon begegnet sein.
![]() ![]() ![]() |
AW: TCollection & TCollectionitem Tutorial
Ja doch das ist mir klar. Nur ich bin mir nicht sicher ob ich die update() Methode verstehe. Diese Ruf ich auf wenn ich ein bestimmtes Item mit index(xy) ändern will oder ?
|
AW: TCollection & TCollectionitem Tutorial
Versuchen wir es mal anders:
Zitiere (kopiere) bitte die vier Absätze der Dokumentation von System.Classes.TCollection.Update in deinen nächsten Beitrag. |
AW: TCollection & TCollectionitem Tutorial
Die Update()-Methode ist
Delphi-Quellcode:
, wenn du einfach hingehst und eine TCollection verwendest kannst du die Methode gar nicht aufrufen.
protected
Wenn du Unterklassen bilden sollst die von TCollection und TCollectionItem ableiten sollen dann macht das natürlich Sinn, ist aber ehrlich gesagt auch nicht ganz trivial (finde ich). Ist dem so? Ich finde das aus Zitat:
|
AW: TCollection & TCollectionitem Tutorial
Ok, ich hab hier ein Beispiel von embarcadero:
Delphi-Quellcode:
Was ich nicht verstehe, wenn ich Panels.Add Aufrufe...muss ich da kein Parameter übergeben?
procedure TForm1.Button1Click(Sender: TObject);
var PanelIndex : Integer; begin with StatusBar1 do begin Panels.BeginUpdate; PanelIndex := StatusBar1.Panels.Count - 1; try Panels.Add; Inc(PanelIndex); Panels.Items[PanelIndex].Text := 'Panel' + IntToStr(PanelIndex); finally Panels.EndUpdate; end; end; end; |
AW: TCollection & TCollectionitem Tutorial
@der schöne Günther...das ist die ganze aufgabenbeschreibung
|
AW: TCollection & TCollectionitem Tutorial
Zitat:
Wie immer hilft ein Blick in den Quelltext:
Delphi-Quellcode:
function TCollection.Add: TCollectionItem;
begin Result := FItemClass.Create(Self); Added(Result); end; |
AW: TCollection & TCollectionitem Tutorial
Zitat:
Zitat:
|
AW: TCollection & TCollectionitem Tutorial
Oh habe ich übersehen, muss leider mit dem Handy tippen.
A component that organized the Threads and their Output a: Use TCollection with its methods "Changed" and "Update" |
AW: TCollection & TCollectionitem Tutorial
Also wird mit der Update Methode einfach ein neues Item erzeugt und an die letzte Stelle der Liste eingefügt?
|
AW: TCollection & TCollectionitem Tutorial
Zitat:
|
AW: TCollection & TCollectionitem Tutorial
Zitat:
|
AW: TCollection & TCollectionitem Tutorial
Probiere das folgende Konsolenprogramm mal aus, vielleicht hilft dir das weiter:
Delphi-Quellcode:
program Project3;
{$APPTYPE CONSOLE} {$R *.res} uses System.SysUtils, System.Classes; type TMyCollectionItem = class(TCollectionItem) private // hier kannst du auch eigene Felder und Methoden definieren protected function GetDisplayName: string; override; end; TMyCollection = class(TCollection) protected procedure Update(Item: TCollectionItem); override; procedure SetItemName(Item: TCollectionItem); override; procedure Notify(Item: TCollectionItem; Action: TCollectionNotification); override; public procedure BeginUpdate; override; procedure EndUpdate; override; end; procedure TMyCollection.BeginUpdate; begin inherited; Writeln('BeginUpdate'); end; procedure TMyCollection.EndUpdate; begin inherited; Writeln('EndUpdate'); end; procedure TMyCollection.Notify(Item: TCollectionItem; Action: TCollectionNotification); begin inherited; case Action of cnAdded: Writeln(Item.DisplayName + ' added'); cnExtracting: Writeln(Item.DisplayName + ' extracing'); cnDeleting: Writeln(Item.DisplayName + ' deleting'); end; end; procedure TMyCollection.SetItemName(Item: TCollectionItem); begin inherited; Writeln(Item.DisplayName + ' ItemName'); end; procedure TMyCollection.Update(Item: TCollectionItem); begin inherited; if Assigned(Item) then begin // Ein einzelnes Item wurde befummelt Writeln(Item.DisplayName + ' updated'); end else // wenn Item = nil, dann ist die ganze Collection betroffen end; function TMyCollectionItem.GetDisplayName: string; begin Result := 'HuiBui: ' + IntToStr(Self.ID); end; procedure Main; var MyCollection: TMyCollection; MyItem: TCollectionItem; I: Integer; Something: string; begin MyCollection := TMyCollection.Create(TMyCollectionItem); try MyCollection.BeginUpdate; try for I := 0 to 10 - 1 do begin MyItem := MyCollection.Add; end; finally MyCollection.EndUpdate; end; Something := ''; for I := 0 to MyCollection.Count - 1 do begin MyItem := MyCollection.Items[I]; Something := Something + MyItem.DisplayName + ' '; end; Writeln(Something); MyCollection.Items[5].DisplayName := 'asdf'; MyCollection.Delete(5); finally MyCollection.Free; end; end; begin try Main; Readln; except on E: Exception do Writeln(E.ClassName, ': ', E.Message); end; end. end. |
AW: TCollection & TCollectionitem Tutorial
Okay super, vielen danke ..das nehm ich mir jetzt mal genau unter die Lupe.
Create and destroy Threads Start and Stop Threads Configure the thread interval Print the Output of the Threads Aber mit Threads hatte ich echt noch nie etwas zu tun, deswegen hab ich das erstmal hinten angestellt |
AW: TCollection & TCollectionitem Tutorial
Zitat:
|
AW: TCollection & TCollectionitem Tutorial
Sorry, muss zugeben..bin bei der Aufgabe ziemlich hilflos. Für Output ist die Aufgabe
a User Interface and Area for the Output of The Threads |
AW: TCollection & TCollectionitem Tutorial
Hast du die Aufgabe als A4-Papier, E-Mail oder sonstwie oder wurde dir das auch Zeilenweise per Chat mitgeteilt?
Stelle doch mal die GANZE Aufgabe von vorne bis hinten hier rein. (Ja, man kann scannen/abfotografieren und hier Bilder hochladen). |
AW: TCollection & TCollectionitem Tutorial
Liste der Anhänge anzeigen (Anzahl: 1)
Ist im Anhang. Sorry für die unbeholfenheit
|
AW: TCollection & TCollectionitem Tutorial
Also schon mal danke für deine Hilfe, mit Hilfe deines Codes hab ich es geschafft mit der Update() Methode Items hinzuzufügen
|
AW: TCollection & TCollectionitem Tutorial
Zitat:
Da musst du dir schon ein bisschen mehr Mühe geben, wenn am Ende ein fertiger, studierter und ernst zunehmender Ingenieur/Informatiker raus kommen soll. Bisher war es einfach nur schlumpfig! Hast du denn schon die Formularoberfläche zusammengeklickt? |
AW: TCollection & TCollectionitem Tutorial
Zitat:
Mit der Update-Methode wird KEIN Item hinzugefügt. Siehe Beitrag #17 ![]() |
AW: TCollection & TCollectionitem Tutorial
Nein, ich weiß nicht wie ich da am besten vorgehen soll. Ich hatte bis gestern noch nie was mit delphi, TCollection oder Threads zu tun
|
AW: TCollection & TCollectionitem Tutorial
Zitat:
Ich nehme an, du hast eine andere Programmiersprache im Studium kennengelernt, sowas wie C++, Java oder C#. Wie würdest du da diese Aufgabe lösen? Anhand dessen können wir vergleichen und Unterschiede und Parallelen zu Delphi ziehen. |
AW: TCollection & TCollectionitem Tutorial
Zitat:
Darf man fragen in welchen Semester du genau bist und an welcher Hochschule? |
AW: TCollection & TCollectionitem Tutorial
Naja C und C++ und beide Prüfungen ohne Probleme geschafft. Bin jetzt im 5ten Semester. Die Formularoberfläche zusammenklicken sollte kein Problem darstellen.
Und bezüglich Nebenläufigkeiten, ist mir jetzt schon bewusst geworden, dass viele eigene Projekte hilfreich gewesen wären, nur für das Studium selbst musste ich nie etwas ähnliches programmieren |
AW: TCollection & TCollectionitem Tutorial
Was ein Thread ist, weiß ich natürlich
|
AW: TCollection & TCollectionitem Tutorial
Schritt 1: Formularoberfläche zusammenklicken!
Schritt 2: Alles über Threads und die Delphi-Implementierung TThread herausfinden, recherchieren, lesen (zu finden in der Unit System.Classes). Schritt 3: Mit konkreten und speziellen Fragen wiederkommen. |
AW: TCollection & TCollectionitem Tutorial
Okay, Danke
|
AW: TCollection & TCollectionitem Tutorial
Zitat:
|
AW: TCollection & TCollectionitem Tutorial
Hi, jetzt hätte ich eine spezielle Frage zu Threads.
Ich habe folgenden Code procedure TForm1.ButtonClick(Sender:TObjecjt) Var I:integer Begin For i:=1 to 6 so Begin With TMyThread.Create(true) so Begin Counter:=i; FreeOnTerminate:=True; OnTerminate:=ThreadTerminated; Resume; End; End; End; So meine Fragen wären. "Counter" ist in der klasse TMyThread deklariert ...kann ich meine einzelnen Threads dann über diesen Counter ansprechen ? Und OnTerminated:=ThreadTerminated ..wird damit die Methode "ThreadTerminated" aufgerufen und was wird da zurückgegeben. Die Methode : Procedure TForm1.ThreadTerminated(Sender:TObject); Begin if Sender is TMyThread then Begin ... End; End; |
AW: TCollection & TCollectionitem Tutorial
Bitte benutze Delphi-Tags. Wenn du Beiträge schreibst, ist es der kleine Helm links vom Google-Symbol oben in der Leiste über den Eingabefeld.
Bitte sofort Sachen wie das with-Statement und TThread.Resume vergessen. Auch in XE5 müsste schon sowas in der Klassendefinition stehen wie:
Delphi-Quellcode:
Das
// This function is not intended to be used for thread synchronization.
procedure Resume; deprecated;
Delphi-Quellcode:
ist ein Schlüsselwort, um darauf hinzuweisen, dass diese API veraltet ist und nicht mehr benutzt werden soll.
deprecated;
Die Fragen: 1. Jein, dafür ist das wohl nicht gedacht. Du kannst es aber zur Identifizierung für in <siehe 2.> nutzen. 2. ThreadTerminated wird im Kontext des Mainthreads (da wo dein Formular drin läuft) aufgerufen und signalisiert, dass der externe Thread beendet ist. Was du darin machst bleibt dir überlassen. Denkbar wäre z.B.:
Delphi-Quellcode:
Wie du siehst ist das Argument Sender in diesen Fall die noch lebende Instanz von TMyThread, kurz bevor er freigeben wird (durch dein FreeOnTerminate:=True; )
procedure TForm1.ThreadTerminated(Sender: TObject);
begin if Sender is TMyThread then begin ShowMessage(TMyThread(Sender).Counter.ToString + ' is gone to hell!'); end; end; Noch was: Bitte benutze Strg + D oder Edit -> Format Source um den Quelltext nach dem eingestellten Standard zu formatieren. |
AW: TCollection & TCollectionitem Tutorial
Okay sorry, hab mit dem Handy geschrieben.
Danke für die Antwort, verstehe ich alles. Würde ich jetzt die Schleife so setzen, dass nur 1 Thread erstellt wird. Wie könnte ich diesen dann über einen weitern Button wieder beenden oder pausieren lassen? |
AW: TCollection & TCollectionitem Tutorial
Zitat:
"GibMirEinNeuesItem" sagt doch schon alles. Auch wenn der Beispiel-Code an sich schon nicht grade der Beste ist.
Delphi-Quellcode:
Man verwendet gefälligst den Rückgabewert der "Funktion" und arbeitet damit weiter.
Panels.BeginUpdate;
try NewPanel := Panels.Add; NewPanel.Text := 'Panel' + IntToStr(StatusBar1.Panels.Count - 1); finally Panels.EndUpdate; end; Vorallem da du dich grade mit Threads/Nebenläufigkeit beschäftigst. Etwas erstellen und dann an "zufälliger" Stelle etwas rausholen, was "womöglich" dein grade Erstellstes ist ... da kann schnell mal was "Anderes" raus kommen, wenn nebenher jemand die Liste verändert. PS:
Delphi-Quellcode:
: Warum
StatusBar1.Panels.Count
Delphi-Quellcode:
, wo man doch eh grade in dem bösen
StatusBar1.
Delphi-Quellcode:
drin ist?
with StatusBar1 do
|
AW: TCollection & TCollectionitem Tutorial
Zitat:
Du musst uns schon ein bisschen mehr füttern, wir haben keine Glaskugel. :glaskugel: Warum schreibst du nicht vom Programmierrechner aus? Hat der kein Internet? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:32 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