Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Sa Jul 19, 2025 12:29

Foren-Übersicht » Sonstiges » Community-Projekte
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 427 Beiträge ]  Gehe zu Seite Vorherige  1 ... 7, 8, 9, 10, 11, 12, 13 ... 29  Nächste
Autor Nachricht
 Betreff des Beitrags:
BeitragVerfasst: Mi Dez 06, 2006 16:11 
Offline
DGL Member
Benutzeravatar

Registriert: Di Okt 03, 2006 14:07
Beiträge: 1277
Wohnort: Wien
@Sidorion:

Aber, aber.
Wer wird denn so zerstörerisch veranlagt sein.

@Off Topic: Wenn Du Oma Wetterwachs kennst, dann kennst Du vielleicht auch Mustrum Ridcully oder Sam Mumm?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Dez 06, 2006 17:42 
Offline
DGL Member
Benutzeravatar

Registriert: Di Okt 03, 2006 14:07
Beiträge: 1277
Wohnort: Wien
Meine Lieben,
da anscheinend keiner mehr da ist, verabschiede ich mich für heute auch.
Traude


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Dez 06, 2006 17:58 
Offline
Ernährungsberater
Benutzeravatar

Registriert: Sa Jan 01, 2005 17:11
Beiträge: 2068
Programmiersprache: C++
Erstmal:
2 Seiten in 9 Stunden ...
Wir sprengen Flow die Datenbank... :P

Traude hat geschrieben:
Ein schweres Argument gegen meine Methode ist: sie wollen es offenbar aus irgendeinem Grund nicht. Das Ist nicht von der Hand zu weisen. Ein Programmierer wird Code, den er nicht mag, auch nicht benutzen. Und weil das auch der innerste Kern von dem ganzen Ding ist, sollten wir uns dafür Zeit nehmen. Ich brüte grade darüber.
Traude

Ok, Danke.

Sidorion hat geschrieben:
qui tacet, prosentire videtur et ceterum censeo Carthaginem esset delendam (Catho, der ältere)

lat.: Wer schweigt, wird als zustimmend angenommen und übrigens bin ich der Meinung, dass Karthago zerstört werden sollte.

Wer nicht warten kann hat keine Geduld :P

Und ich bin jetzt da, zumindest noch 15 Minuten ;)
Ähm, b.t.T.:
Bin auch für Objectlist, die nimmt uns Arbeit ab, also gut ;)

_________________
Steppity,steppity,step,step,step! :twisted:
❆ ❄ ❄ ❄ ❅ ❄ ❆ ❄ ❅ ❄ ❅ ❄ ❅ ❄ ❄
❄ ❄ ❄ ❅ ❄ ❄ ❄ ❅ ❄ ❄ ❆ ❄ ❄


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Dez 06, 2006 18:54 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 18, 2004 16:45
Beiträge: 2623
Wohnort: Berlin
Programmiersprache: Go, C/C++
Erstmal zum Mailverkehr.
Ich werde noch bekloppt mit der automatischen Mailbenachrichtigung aber ich hab ja I0n0s :).

Ich muss mal ein bischen alten Kaffee aufkochen, da ich ziemlich spät rein geguckt hab.

Code:
  1. window:=TGUIWindow.create();
  2. button:=TGUIButton.create(window);

Ist eine sehr anstrebenswerte sache.
Wie sie genau realisiert wird ist momentan weniger interessant.

Wichtig ist doch folgendes.
Code:
  1. constructor TGUIButton.create(owner:TGUIWidget);
  2. begin
  3.   inherited create(owner);
  4.   ...
  5. end;


Das das TGUIWidget dann im constructor dem parent den owner zuweist und das Widget hinter parent als child self bekommt ist dann ne sache, wie der programmierstiel dann ausfällt.

Um nochmal auf das Eventsystem von unserer GUI zu sprechen zu kommen.

Im Manager sind die basis Events also Taste drücken,Maus drücken, Maus bewegen und aus diesen wird dann vom Manager die speziellen events wie Drag&Drop, Paint, MouseOver,... abgeleitet. Der Manager ruft nun alle childs(was übrigens über TObjectList realisiert ist) auf wo die Bedingungen für den jeweiligen Event stimmen(MouseOver sollte das Element auch wirlich unterm Cursor liegen). Sprich es wird das Event von TXD_GUI_Widget aufgerufen und darin ist verankert, dass es deren Kinder auf den Keks geht(rekursiv halt). Diese Variante geht in die Tiefe und nicht in die Breite und ist daher wesentlich schneller am Ziel als andere Variante. Sobal ein Widget sagt, ich bin ein armes Schwein und habe keine Childs, gibt es zurück das er den Event entgegennimmt und alle Schleifen werden sofort beendet. Ein Widget was kein Input verarbeiten kann, wird das Event einfach ignorieren und der Event ist gegessen.
Drag und Drop und ähnliche dinge sind auch leicht gelöst. Eine Variable LastWidget, im Manager, kann vom Drag Event belegt werden und vom Drop event ausgewertet werden und eventuell ein AcceptDrop Event auslösen.

Wenn eine Komponente vernichtet wird, dann muss auch alles was drunter liegt also jedes Child und deren Child gekillt werden. Sowas wird im destructor rein gepackt und wird auch rekursiv gelöst.

Ein Bildformat hat hier übrigens wenig verloren, denn welches Bildformat verwendet wird ist nicht die Sache der GUI sondern des externen Textur Managers.

Da es ein Standard Binding geben sollte, z.B. SDL,SDL_Image,SDL_TTF und libXMLparser wäre es praktisch eine Interne Struktur zu erstellen. Sprich für Formulardaten nimmt man nicht XML sondern es wird ein Baum oder ähnliches verwendet und eine Schnittstelle kann dann ein parser für XML, binäres XML, ini oder ähnliches die Daten liefern. Das selbe sollte auch für Texture, Fonts und Themes gelten.

Somit ist der Kram aus der GUI raus und man muss ledeglich mal ein paar bindings für gängige libs erstellen(um es einsteigerfreundlich zu machen).

_________________
"Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren"
Benjamin Franklin

Projekte: https://github.com/tak2004


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Dez 07, 2006 09:36 
Offline
DGL Member
Benutzeravatar

Registriert: Di Sep 03, 2002 15:08
Beiträge: 662
Wohnort: Hamburg
Programmiersprache: Java, C# (,PhP)
Wegen dem Klassendiagram hab ich ne allgemeine Frage zu Delphi. Unterstützt Delphi in irgendeiner Weise Mehrfachvererbung oder Interfaces? Oder totale Einzelvererbung ohne Interface Möglichkeiten?

_________________
(\__/)
(='.'=)
(")_(")


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Dez 07, 2006 09:59 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Also Delphi unterstützt Interfaces aber keine Mehrfachvererbungen. Eine Klasse kann mehrere Interfaces unterstützen aber nur von einer Klasse abgelitten sein. Wenn ich jetzt wüsste was "totale Einzelvererbung" wäre könnte ich dir dazu evtl auch etwas sagen.

Aber eine normale Vererbungshirarchie sollte dafür aber eigentlich vollkommen ausreichen. Also ohne interfaces. Es muss ja schließlich auch Platformunabhängig sein.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Dez 07, 2006 10:02 
Offline
DGL Member
Benutzeravatar

Registriert: Di Sep 03, 2002 15:08
Beiträge: 662
Wohnort: Hamburg
Programmiersprache: Java, C# (,PhP)
Mit totale Einzelverbung meinte ich eine Vererbung die nicht auf Interfaces zurückgreifen kann. Da man mit Interfaces eine Art der Mehrfachvererbung nachbilden kann ;) Werd mich am Wochenende mal zu einem ersten Klassendiagramm hinreißen lassen und hoffentlich schon beim ersten Ansatz an alles wichtige denken.

_________________
(\__/)
(='.'=)
(")_(")


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Dez 07, 2006 11:21 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
Interfaces selber können Mehrfachvererbung.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Dez 07, 2006 11:22 
Offline
DGL Member

Registriert: Mo Dez 20, 2004 08:58
Beiträge: 442
Wohnort: Mittweida (Sachsen)
Interfaces haben Vor- und Nacheile:
Nachteil: Bei Verwendung von Interfaces muss man komplett umstellen, da interfaces eine Referenzierungszählung haben, die bei gleichzeitiger Verwendung des Objekts über Interface und Klasse durcheinanderkommt. (z.B.: bei Erzeugung und Zuweisung auf Klasseninstanzvariable wird die Instanz sofort wieder zerstört)
Vorteil: Man spart sich komplizierte Klassenhierarchien, so kann man z.B.: jeden Eventtyp in ein Interface packen und das Widget hat das Interface oder nicht. Das ist von der Klassenhierarchie unabhängig.
Die Bearbeitung des Events kann man dann sogar in eine Delegatenklasse auslagern, die sich um die Implementierung des Interfaces kümmert. Ich hab das mal für ein XML-Streaming gebaut, bei dem alle published-Propertys in ein XML-File geschrieben wurden, ähgnlich wie das die Delphi-eigene streaming-Geschichte macht. Um eine Kalsse dann XML-Streaming-fähig zu machen genügt es, ihr das Interface zu verpassen und ne Instanz der Delegatenklasse anzulegen.

_________________
Manchmal sehen Dinge, die wie Dinge aussehen wollen, mehr wie Dinge aus, als Dinge.
<Esmerelda Wetterwax>
Es kann vorkommen, dass die Nachkommen trotz Abkommen mit ihrem Einkommen nicht auskommen und umkommen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Dez 07, 2006 11:47 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
Die Referenzzählung kann man ja ausschalten wenn man AddRef und Release entsprechend implementiert. Ist eigentlich keine gute Sache, dass interfaces immer von IUnknown erben. Bei FP kann man das umstellen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Dez 07, 2006 11:58 
Offline
DGL Member
Benutzeravatar

Registriert: Di Sep 03, 2002 15:08
Beiträge: 662
Wohnort: Hamburg
Programmiersprache: Java, C# (,PhP)
Also ist das folgende in Delphi eher weniger sinnvoll? Mal von der allgemeinen Sinnlosigkeit dieser Zusammenstellung im Beispiel abgesehen ;D
Hoffe das Beispiel ist selbsterklärend genug.

Code:
  1. public interface IDuft {
  2.    
  3.     public void dufte();
  4.    
  5. }


Code:
  1. public abstract class Pflanze  {
  2.    
  3.     public void bluehe() {
  4.         // Anweisung
  5.     }
  6. }


Code:
  1. public class Rose extends Pflanze implements IDuft {
  2.    
  3.     // ueberschreiben
  4.     public void bluehe() {
  5.         // Neue Anweisung
  6.        
  7.         super.bluehe();
  8.     }
  9.    
  10.     // function aus IDuft
  11.     public void dufte() {
  12.         System.out.println("Ah, schoener Rosenduft");
  13.     }
  14. }


Code:
  1. public abstract Getraenk {
  2.    
  3.     public void verderben() {
  4.         // Anweisung
  5.     }
  6. }


Code:
  1. public class Tee extends Getraenk implements IDuft {
  2.    
  3.     // ueberschreiben
  4.     public void verderbern() {
  5.         // Neue Anweisung
  6.                
  7.         super.verderbe();
  8.     }
  9.    
  10.     // function aus IDuft
  11.     public void dufte() {
  12.         System.out.println("Ah, welch herrlicher Aromaduft");
  13.     }
  14. }


Code:
  1. public class DuftTester {
  2.    
  3.     // Von irgendwem wird diese Klasse schon gestartet <!-- s;) --><img src=\"{SMILIES_PATH}/icon_wink.gif\" alt=\";)\" title=\"Wink\" /><!-- s;) -->
  4.    
  5.     private IDuft duft = null;
  6.    
  7.     public DuftTester() {
  8.         // per Instanzierung
  9.         duft = new Rose();
  10.         duft.dufte();
  11.        
  12.         duft = null;
  13.         duft = new Tee();
  14.         duft.dufte();
  15.        
  16.         // per cast
  17.         ((Rose)duft).dufte();   // Rosenduft
  18.     }
  19. }

_________________
(\__/)
(='.'=)
(")_(")


Zuletzt geändert von Evil-Devil am Do Dez 07, 2006 12:05, insgesamt 2-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Dez 07, 2006 12:00 
Offline
DGL Member
Benutzeravatar

Registriert: Di Okt 03, 2006 14:07
Beiträge: 1277
Wohnort: Wien
Guten Morgen.
Mit Interfaces müsste ich mich erst näher beschäftigen. Habe die Interfaces immer links liegengelassen, weil ich sie für eine Umsetzung des Windows-COM-Konzeptes hielt.

Sidorion schrieb:
Zitat:
Interfaces haben Vor- und Nacheile:
Nachteil: Bei Verwendung von Interfaces muss man komplett umstellen, da interfaces eine Referenzierungszählung haben, die bei gleichzeitiger Verwendung des Objekts über Interface und Klasse durcheinanderkommt. (z.B.: bei Erzeugung und Zuweisung auf Klasseninstanzvariable wird die Instanz sofort wieder zerstört)

Klingt mir gar nicht gut. Habs aber eigentlich nicht verstanden. Ich erzeuge das Interface und weise es z.B. einer Variable eines TObjects zu (vulgo: das Objekt soll ein Interface besitzen), dabei wird es zerstört?

Sidorion schrieb:
Zitat:
Vorteil: Man spart sich komplizierte Klassenhierarchien, so kann man z.B.: jeden Eventtyp in ein Interface packen und das Widget hat das Interface oder nicht. Das ist von der Klassenhierarchie unabhängig.

Das ist doch auch bei den Methodenzeigern so. Was ist der prinzipielle Unterschied? 'Tschuldigung, habe noch nicht mit Interfaces gearbeitet.

Zitat:
Die Bearbeitung des Events kann man dann sogar in eine Delegatenklasse auslagern, die sich um die Implementierung des Interfaces kümmert. Ich hab das mal für ein XML-Streaming gebaut, bei dem alle published-Propertys in ein XML-File geschrieben wurden, ähgnlich wie das die Delphi-eigene streaming-Geschichte macht. Um eine Kalsse dann XML-Streaming-fähig zu machen genügt es, ihr das Interface zu verpassen und ne Instanz der Delegatenklasse anzulegen.

Weißt Du wo der Unterschied liegt, wenn ich zB. für ein TGUIItem ein Interface habe, welches das XML-Streaming erledigt, oder aber ich baue mir ein Objekt TXMLDataProvider? Eine fällt mir gleich selbst ein: eine Schnittstelle muss es natürlich geben. Und die muss natürlich vorher vereinbart werden. Könnte man aber doch machen?


Allerdings ist das Thema AKTUELL, weil grade bei mir die Frage auftaucht, wie die UserEvents nun wirklich zu implementieren sind, als Prozedurzeiger oder als Objektzeiger oder beides.

Traude


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Dez 07, 2006 12:17 
Offline
DGL Member

Registriert: Mo Dez 20, 2004 08:58
Beiträge: 442
Wohnort: Mittweida (Sachsen)
@LarsMittendorf: Also vom Ausschalten des Standardverhaltens halte ich nu garnix, zumal die GUI ja von Leuten verwendet werden soll, die nicht wissen, dass wir das geändert haben. Ich hab das früher auch gemacht, aber wenn man sich an gewisse Regeln hält, passiert garnix.

@Traude: Intern passiert hier folgendes:

Beispiel1: mit Klassenreferenz:
Code:
  1.  
  2. var
  3.   oMyObj: TMyObj;
  4. begin
  5.   oMyObj:=TMyObj.Create;
  6.   ...
  7. end;

Wenn TMyObj ein Interface hat, wird beim Konstruieren (innerhalb des Konstruktors) das Interface mit angelegt. Dieses hat einen Referenzzähler, der auf 0 initialisiert wird. Soweit ist noch alles gut. Jetzt wird die erzeugte Instanz auf die Klassenvariable oMyObj zugewiesen. Dabei wird der Referenzzähler aber nicht incrementiert, da oMyObj eben eine Klasseninstanz ist. Nach der Zuweisung wird nun geschaut, ob der Referenzzähler =0 , wenn ja, wird die Instanz freigegeben und oMyObj zeigt in die Pampa.

Beispiel2: Mit Interfacereferenz:
Code:
  1.  
  2. var
  3.   oMyIntf: IMyIntf;
  4. begin
  5.   oMyIntf:=TMyObj.Create;
  6.   ...
  7. end;

Hier passiert im Konstruktor das gleiche, wie vorhin, aber das oiMyObj eine Interfacereferenz ist, wird der interne Referenzzähler hochgezählt und ist nach der Zuweisung nicht=0 und die Instanz bleibt bestehen.

Ich kann also instanzen von TMyObj erzeugen, aber wenn nicht mindestens ein Verweis auf mindestens ein Interface existiert, wird die Instanz zerstört.
Mir ist noch ein Vorteil eingefallen: Alle Interfaces des selben Klassentyps sind zuweisungskompatibel:
Code:
  1.  
  2. Type
  3.   IIntfA=Interface...
  4.   IIntfB=Interface....
  5.  
  6.   TFoo=Class(TObject, IIntfA,IIntfB)......
  7.  
  8. .......
  9.  
  10. ...
  11. Var
  12.   oIntfA: IIntfA;
  13.   oIntfB: IIntfB;
  14. begin
  15.   oIntfA:=TFoo.Create;
  16.   oIntfB:=oIntfA //geht
  17. end;
  18.  

_________________
Manchmal sehen Dinge, die wie Dinge aussehen wollen, mehr wie Dinge aus, als Dinge.
<Esmerelda Wetterwax>
Es kann vorkommen, dass die Nachkommen trotz Abkommen mit ihrem Einkommen nicht auskommen und umkommen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Dez 07, 2006 12:44 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 18, 2004 16:45
Beiträge: 2623
Wohnort: Berlin
Programmiersprache: Go, C/C++
Die Schnittstelle nach aussen, also zur script engine und zu dingen wie xml loader, hab ich in XD_GUI so gelöst.
Code:
  1. TXD_GUI_Widget=class(TXD_RTTI);

Nun sind alle properties im published bereich nach aussen nutzbar.
Die TXD_RTTI Klasse ist eine Klasse die dann Funktionen bietet um Werte zu lesen und zu schreiben+ein paar anderen sachen.
Der XML Loader(der nicht in die GUI gehört) kann dann ein Widget erstellen und über die von der TXD_RTTI Klasse gelieferten funktionen einfach 2 strings(name der variable und wert) übergeben und fertig. Somit kann man in den GUI Widgets rumspielen wie man lustig ist. Die von der Klasse gelieferten Informationen werden immer nutzbar nach aussen gelegt.

Die RTTI daten werden eh für jede Klasse angelegt und dann sollte man sie doch auch nutzten.
Meine Idee für die GUI würde so aussehen.

TRTTI
Besitzt Funktionen, um published properties zu lesen und zu schreiben.
Kleine anmerkung nebenbei, Delphi und FPC unterstützen nicht alle arten von Properties.
FPC kann momentan noch keine properties vom typ record und bei Delphi gibt es auch ein paar Typen.
Allerdings werden alle wichtigen Typen unterstützt(klassen,methoden,zahlen,zeichenketten,sets,interface,object,...).

TRTTIManager
Man kann Klassen die von der TRTTI Klasse abgeleitet wurden registrieren und entfernen.
Es gibt eine Funktion die anhand eines Strings erkennt welche registrierte Klasse gemeint ist und erstellt eine Instanz davon.

Das spart echt viel programmier Zeit, für nutzer der GUI und für die entwickler der GUI.
Ausserdem kann man so ein völlig neue GUI Version nutzen ohne sein eigenen Code ändern zu müssen.

Wer jetzt grübelt, wie so etwas aussehen kann, hier mal ein kleines Beispiel.

Code:
  1.  
  2. myownmethode=procedure (name:string) of object;
  3. TXD_GUI_Widget=class(TXD_RTTI)
  4. ...
  5. published
  6.       property Parent    : TXD_GUI_Widget Read fParent       Write SetParent;
  7.       property Top        : Integer        Read fTop          Write SetTop;
  8.       property Left        : Integer        Read fLeft         Write SetLeft;
  9.       property Active     : Boolean        Read fActive       Write SetActive;
  10.       property Visible    : Boolean        Read fVisible      Write SetVisible;
  11.       property methode : myownmethode read fmyownmethode;
  12. ...end;

_________________
"Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren"
Benjamin Franklin

Projekte: https://github.com/tak2004


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Dez 07, 2006 12:49 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
Ob es so sinnvoll ist, dass man zum Lesen/Schreiben von Properties von einer Klasse ableiten muss? Immerhin ist dann die einzige Möglichlichkeit von einer Klasse zu erben schon belegt. In der VCL gibt's dafür dann ja auch die TReader/TWriter Komponenten und Serialisierung ist eigentlich nirgendwo weder bei Java noch bei .Net direkt in der Klasse.


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 427 Beiträge ]  Gehe zu Seite Vorherige  1 ... 7, 8, 9, 10, 11, 12, 13 ... 29  Nächste
Foren-Übersicht » Sonstiges » Community-Projekte


Wer ist online?

Mitglieder in diesem Forum: Bing [Bot] und 1 Gast


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.023s | 17 Queries | GZIP : On ]