amiga-news ENGLISH VERSION
.
Links| Forum| Kommentare| News melden
.
Chat| Umfragen| Newsticker| Archiv
.

amiga-news.de Forum > Programmierung > OOP-GUI Systeme und Content-Clipping [ - Suche - Neue Beiträge - Registrieren - Login - ]

1 2 3 -4- [ - Beitrag schreiben - ]

19.07.2011, 11:38 Uhr

AGSzabo
Posts: 1663
Nutzer
@Der_Wanderer:

> Sorry, aber das finde ich gräßlich und verletzt so ziemlich alle Regeln der GUI Kunst...

ohje, wo denn?

> Alleine der Austausch mit anderen Entwicklern bringt ja schon viel, wie du vielleicht selbst hier gemerkt hast.

Du kannst mit meinen Ideen was anfangen?
--
Sam mini os4.1 upd. 2 / e-uae 39bb2 / A4000D 3.0 & 3.9 2mbchip 8mbfast Ariadne_II ide DVD und HD / A500 3.1 (mkick) adide 50mb / Athlon ii X2 Ubuntu Linux

[ - Antworten - Zitieren - Direktlink - ]

19.07.2011, 12:10 Uhr

Holger
Posts: 8116
Nutzer
Zitat:
Original von Der_Wanderer:
Nein, aus OOP Sicht ist das Überladen. Du hast mehrer Funktionen die alle Layout heissen nur mit verschiedenen typen:

Nein, jetzt noch mal ganz ausführlich.

Du hast eine Klasse x, die eine Funktion f definiert. Und Du hast ein Stück Code, das diese Funktion f aufruft, aber zur Laufzeit auf f' umgebogen wird, weil es sich bei dem Objekt um eine Unterklasse von x handelt, die f überschreibt.

Überladen ist eine Funktion, die unterschiedliche Versionen anbietet, die aber typischerweise das gleiche machen, von denen zur Compilezeit aufgrund der Aufrufparameter die richtige ausgewählt wird.
code:
int min(int x, int y) { return x<y? x: y; }
long min(long x, long y) { return x<y? x: y; }
float min(float x, float y) { return x<y? x: y; }

Das ist überladen.

Wenn Du in einem GUI-Tree, deren Elementtypen Du zur Compilezeit gar nicht kennst, für die Elemente die jeweils richtige Funktion aufrufen willst, dann geht das nur, wenn die Elementtypen die entsprechende Funktion des Basistypen überschrieben haben. Oder Du etwas ganz anderes, viel komplizierteres machst.
Zitat:
In Assembler oder plain C gibt es kein Überladen, daher muss man das mit Funktionpointern machen.
In Assembler gibt es gar keine Funktionssignaturen, daher ist die Frage nach dem Überladen sinnlos, in C ist es per se nicht möglich, da Überladen sich ausschließlich auf die Sprachmittel beschränkt.

Überschreiben kann man dagegen in beiden Sprachen implementieren.
Zitat:
Wenn ein User seine eigene Hook reinsetzt ist das auch Überladen, da, aus OOP Sicht, eine Subklasse gebildet wird.
Nein, das ist überschreiben. Und in diesem Falle auch im wörtlichsten Sinn, denn Du überschreibst den ursprünglichen Hook-Pointer. Überladen wäre es, wenn es mehr als einen Hook-Pointer für unterschiedliche Parametertypen gäbe.

Ich weiß, deutsche OOP-Anleitungen bringen das gerne durcheinander...

Zitat:
Das Layouten geht in der Regel sehr schnell, nur das neu zeichnen nicht.
Deshalb muss der Mauspointer wohl kaum einfrieren...

Ja, wie gesagt, das ist der Unterschied zwischen dem Entwickeln einer Anwendung und eines Toolkits. Du kannst gar nicht wissen, wie schnell der Layout-Prozess geht, wenn Du gar nicht weißt, wie komplex das Layout einer späteren Anwendung sein wird.
Zitat:
Das neuzeichnen bewirkt ledglich ein setzen des Dirty flags, und erst wenn keine Events mehr anliegen, wir neu gezeichnet.
Genau so sollte es auch beim Layout sein.

--
Good coders do not comment. What was hard to write should be hard to read too.

[ - Antworten - Zitieren - Direktlink - ]

19.07.2011, 13:31 Uhr

Der_Wanderer
Posts: 1229
Nutzer
@AGSzabo:

Das ist so was mir auf den ersten Blick ins Auge gestochen ist:
Zumal man heute eigentlich eher wenig Kontrast gibt, und nur die Schrift hart macht. Das erlaubt heute die gute Qualität der Monitore, und erhöht den Blick aufs Wesentliche bei gleichzeitiger Reduktion von Eye-Strain.

Bild: http://www.hd-rec.de/pics/xuibig2.jpg


--
--
Author of
HD-Rec, Sweeper, Samplemanager, ArTKanoid, Monkeyscript, Toadies, AsteroidsTR, TuiTED, PosTED, TKPlayer, AudioConverter, ScreenCam, PerlinFX, MapEdit, AB3 Includes und viele mehr...
Homepage: http://www.hd-rec.de


[ - Antworten - Zitieren - Direktlink - ]

19.07.2011, 13:55 Uhr

AGSzabo
Posts: 1663
Nutzer
@Der_Wanderer:

whoops, das gibt einem zu denken. kann man den gradient-slider borderless machen und den rahmen davon selber zeichnen? es ist der standard rahmen, den amiga os zur verfügung stellt. unter os 4 passt es.
--
Sam mini os4.1 upd. 2 / e-uae 39bb2 / A4000D 3.0 & 3.9 2mbchip 8mbfast Ariadne_II ide DVD und HD / A500 3.1 (mkick) adide 50mb / Athlon ii X2 Ubuntu Linux

[ - Antworten - Zitieren - Direktlink - ]

19.07.2011, 16:35 Uhr

Der_Wanderer
Posts: 1229
Nutzer
Hier mal ein Vergleich, wie die GUI auf die Schnelle im default Look (also ohne Gradienten oder Schnickschnack, einmal dick und dünn) von NTUI ausehen würde.
Hoffentlich merkst du dabei, wie "kratzbürstig" und 90er dein Skin rüberkommt, obwohl der Aufbau (über den man sich natürlich auch streiten kann, aber das ist App Programmierer Sache) fast gleich ist.

Bild: http://www.hd-rec.de/pics/xuiex1.png Bild: http://www.hd-rec.de/pics/xuiex4.png
Bild: http://www.hd-rec.de/pics/xuiex3.png
--
--
Author of
HD-Rec, Sweeper, Samplemanager, ArTKanoid, Monkeyscript, Toadies, AsteroidsTR, TuiTED, PosTED, TKPlayer, AudioConverter, ScreenCam, PerlinFX, MapEdit, AB3 Includes und viele mehr...
Homepage: http://www.hd-rec.de


[ - Antworten - Zitieren - Direktlink - ]

19.07.2011, 16:49 Uhr

AGSzabo
Posts: 1663
Nutzer
@Der_Wanderer:

Hm, bin verblüfft. Gute Arbeit. Und mit Skin?
--
Sam mini os4.1 upd. 2 / e-uae 39bb2 / A4000D 3.0 & 3.9 2mbchip 8mbfast Ariadne_II ide DVD und HD / A500 3.1 (mkick) adide 50mb / Athlon ii X2 Ubuntu Linux

[ - Antworten - Zitieren - Direktlink - ]

19.07.2011, 17:04 Uhr

Der_Wanderer
Posts: 1229
Nutzer
Ich habe noch kein Skin, was alle Widgets "skinned", deshalb würde das seltsam aussehen und ich lasse es erstmal, davon Screenshots zu posten.
Der Default Look, vor allem der dünne, werden aber super schnell gezeichnet und sollte auch gut auf schwachen Maschinen laufen. Es ist dem Amiga-Look nachempfunden, zumindest was ich mir so vorstelle. Es kommt ganz ohne Gradienten aus und sieht trotzdem nicht altbacken aus. Das kommt vor allem wegen den weichen Kontrasten.

Das ist übrigends der Source für die GUI. Den kann man sich nun im Sourcecode als Konstante definieren oder von einer Datei laden, schmeißt ihn in die ntui_CreateFromXML() Funktion und das wars.

code:
<window id='xuiwin' title='NTUI Libs & Info' bgpen=6>
  <group>
    <tabview activetab=1 bgpen=0>
      <vgroup title='Information' image=TBImages:help>
        <label string='Just a button:'/>
      </group>
      <vgroup title='Configuration' image=TBImages:prefs>
        <hgroup>
          <vgroup title='NTUI Env Variables' bordertype=7>
            <ListView title='\pTBImages:question\~|\lVariables|\lValue' id=xuilist>
          </group>
          <vgroup title='Item Options' bordertype=7/>
            <hgroup><Checkbox/><label text=active align=left freewidth/></group>
            <hgroup wrap=2>
              <label text='Web/Hex' align=right><string text=#AEBF34/>
              <label text=Red align=right><string text=231/>
              <label text=Green align=right><string text=81/>
              <label text=Blue align=right><string text=132/>
            </group>
            <hgroup bordertype=7><label text=Preview bgpen=8/></group>
            <image src='Desktop:/Pictures/ColorWheel2.png'/>
          </group fixwidth>
        </group>
        <hgroup bordertype=2 samewidth>
          <button text=Cancel>
          <button text=Revert>
          <button text=Default>
          <button text=Test>
          <button text=Save>
          <button text=Use>
        </group>
      </group>
    </tabview>
  </group>
</window>

--
--
Author of
HD-Rec, Sweeper, Samplemanager, ArTKanoid, Monkeyscript, Toadies, AsteroidsTR, TuiTED, PosTED, TKPlayer, AudioConverter, ScreenCam, PerlinFX, MapEdit, AB3 Includes und viele mehr...
Homepage: http://www.hd-rec.de



[ Dieser Beitrag wurde von Der_Wanderer am 19.07.2011 um 17:06 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

19.07.2011, 17:25 Uhr

AGSzabo
Posts: 1663
Nutzer
@Der_Wanderer:

Das sowohl hgroup als auch vgroup mit /group beendet werden, finde ich etwas ungünstig.

> <vgroup title='Item Options' bordertype=7/>

sollte nicht mit /> beendet werden.

XML-konform müssten alle parameter in ".." stehen, aber das weist du sicherlich. (und samewidth müsste samewidth="true" sein oder änliches)
--
Sam mini os4.1 upd. 2 / e-uae 39bb2 / A4000D 3.0 & 3.9 2mbchip 8mbfast Ariadne_II ide DVD und HD / A500 3.1 (mkick) adide 50mb / Athlon ii X2 Ubuntu Linux

[ Dieser Beitrag wurde von AGSzabo am 19.07.2011 um 17:28 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

19.07.2011, 18:59 Uhr

AGSzabo
Posts: 1663
Nutzer
Binding
-------

Kann bei dir ein objekt mit mehr als zwei anderen (next/prev) gebunden sein? Eine view müsste ja einmel ne verbindung zu einem h-slider und einen zweiten ring mit einem vslider haben. oder habe ich was übersehen?
--
Sam mini os4.1 upd. 2 / e-uae 39bb2 / A4000D 3.0 & 3.9 2mbchip 8mbfast Ariadne_II ide DVD und HD / A500 3.1 (mkick) adide 50mb / Athlon ii X2 Ubuntu Linux

[ - Antworten - Zitieren - Direktlink - ]

19.07.2011, 22:02 Uhr

Der_Wanderer
Posts: 1229
Nutzer
Zitat:
Original von AGSzabo:
@Der_Wanderer:

Das sowohl hgroup als auch vgroup mit /group beendet werden, finde ich etwas ungünstig.

Stimmt. Das liegt daran, dass
<vgroup ...> das gleiche ist wie <group orientation=vertical ...> und
<hgroup ...> das gleiche ist wie <group orientation=horizontal ...>.
Sind also einfach nur Abkürzungen, weil man das oft braucht.
Beenden kann man alle gruppen mit </group> weil es völlig egal ist.
Aber man kann auch </vgroup> schreiben, sieht zugegebenermassen schöner aus.

Zitat:
> <vgroup title='Item Options' bordertype=7/>

sollte nicht mit /> beendet werden.

Stimmt. Mein Parser ist da etwas großzügig.

Zitat:
XML-konform müssten alle parameter in ".." stehen, aber das weist du sicherlich.
Stimmt. Mein Parser ist da etwas großzügig.

Wenn kein Space enthalten ist, können die ".." wegfallen. Und man darf auch '..' verwenden. Das habe ich von HTML übernommen. Ich mache das, weil ich im Sourcecode das als String definiere und nicht immer die " escapen möchte.

Zitat:
(und samewidth müsste samewidth="true" sein oder änliches)
Wirklich? Gibts keine "Switches" die durch ihre blosse Anwesenheit etwas anschalten?

--
--
Author of
HD-Rec, Sweeper, Samplemanager, ArTKanoid, Monkeyscript, Toadies, AsteroidsTR, TuiTED, PosTED, TKPlayer, AudioConverter, ScreenCam, PerlinFX, MapEdit, AB3 Includes und viele mehr...
Homepage: http://www.hd-rec.de



[ Dieser Beitrag wurde von Der_Wanderer am 19.07.2011 um 22:03 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

19.07.2011, 22:09 Uhr

AGSzabo
Posts: 1663
Nutzer
@Der_Wanderer:

> Wirklich? Gibts keine "Switches" die durch ihre blosse Anwesenheit etwas anschalten?

Nee, das ist vielleicht ein bischen blöd, aber es muss tatsächlich zB

samewidth="samewidth"

heissen, wenn du die angaben true oder false vermeiden willst und auch nicht on oder off oder so verwenden willst.

ich finde es mit true oder false gut gelöst.
--
Sam mini os4.1 upd. 2 / e-uae 39bb2 / A4000D 3.0 & 3.9 2mbchip 8mbfast Ariadne_II ide DVD und HD / A500 3.1 (mkick) adide 50mb / Athlon ii X2 Ubuntu Linux

[ - Antworten - Zitieren - Direktlink - ]

19.07.2011, 22:11 Uhr

Der_Wanderer
Posts: 1229
Nutzer
Zitat:
Original von AGSzabo:
Binding
-------

Kann bei dir ein objekt mit mehr als zwei anderen (next/prev) gebunden sein?

Ich hatte doch erwähnt, dass es sich um einen gerichteten Ring handelt. Ich brauche also nicht next/prev, sonder nur next. Somit kann ich beliebig viele Widgets miteinander Binden.
Ein Widget kann aber nur einem Ring angehören. Alles andere wäre auch nicht definierbar. Stell dir vor, ein Widget würde zwei Ringen angehören. Jetzt ändert sich in einem Ring was, und das Widget zieht mit. Was passiert dann mit dem anderen Ring? Passiert nichts, habe ich einen illegalen Zustand, da die Widgets nicht synchron gehalten wurden.
Schicke ich den Wert auch in den zweiten Ring, dann verhält sich das ganze wie ein einziger Ring.

Ring:

A->B->C->...->Z->A

Ändert sich z.B. C, dann schickt er an alle Nachfolger ein Event, bis er wieder bei sich selbst angekommen ist.

Zitat:
Eine view müsste ja einmel ne verbindung zu einem h-slider und einen zweiten ring mit einem vslider haben. oder habe ich was übersehen?
Der hSlider mit seinen Arrows, der vSlider mit seinen Arrows und der View sind alle im gleichen Ring.
Der hSlider sendet HVALUE Events, der andere VVALUE, die Arrows schicken HDELTA und VDELTA, der View schickt und empfängt alles.

Es gibt auch HMAX und HMIN Events, wenn z.b. der View seine Inhaltsgröße ändert, müssen die Slider das ja mitbekommen und sich auch anpassen.



--
--
Author of
HD-Rec, Sweeper, Samplemanager, ArTKanoid, Monkeyscript, Toadies, AsteroidsTR, TuiTED, PosTED, TKPlayer, AudioConverter, ScreenCam, PerlinFX, MapEdit, AB3 Includes und viele mehr...
Homepage: http://www.hd-rec.de


[ - Antworten - Zitieren - Direktlink - ]

19.07.2011, 22:22 Uhr

AGSzabo
Posts: 1663
Nutzer
@Der_Wanderer:

Oho. Dann nehme ich an, dass diese Events standardisiert sind, also nicht blos für eine oder zwei klassen gelten, sondern global definiert sind. Wie richtest du den ring ein? Über IDs? Da hab ich folgendes Problem mit: die Listview baut ihren Ring intern aus IDs auf, aber wenn der benutzer (app programmeirer) diese IDs - er sieht ja nichst von den internas der Listview - auch verwendet, kommt das system durcheinander.

--
Sam mini os4.1 upd. 2 / e-uae 39bb2 / A4000D 3.0 & 3.9 2mbchip 8mbfast Ariadne_II ide DVD und HD / A500 3.1 (mkick) adide 50mb / Athlon ii X2 Ubuntu Linux

[ - Antworten - Zitieren - Direktlink - ]

19.07.2011, 22:25 Uhr

Der_Wanderer
Posts: 1229
Nutzer
Die Binding Events sind definiert, genauso wie alle anderen Events.
Möchte man "selbsterfundene" Messages schicken, gibt es einen User Wertebereich oder kann per XML Attribut kommunizieren.
Das wäre aber nur dann interessant, wenn man zwei eigene, externe Widgets implementiert hat und die so miteinander kommunizieren müssen, dass es mit den "Bordmitteln" nicht geht, wo ich mir aber kein Fallbeispiel konstruieren kann.

Im aller aller schlimmsten Fall ist NTUI ja OpenSource ;-)

Zu den IDs:
IDs werden nur vom User vergeben und haben keinerlei Bedeutung, ausser dass sie als String im Object Struct ihr Dasein fristen und man sie abfragen kann.

Wie ich schon oben sagte, arbeiten alle "echten" Funktionen grundsätzlich mit Pointern, und die sind hoffentlich eindeutig ;-)

Man kann aber IDs in die dazugehörigen Pointer verwandeln,

mit

object* myobj = GetObjectByID("blabla");

Kann natürlich auch fehlschlagen, wenn es die ID nicht gibt.

Um häufig wiederkehrende GetObjectByID Orgien zu vermeiden, gibt es sog. Convinient Stubbs, also Funktionen, die nicht wirklich nötig wären aber einem das Leben leichter machen.

So gibt es zu häufig benutzten Funktionen auch ID Varianten, z.B.
code:
BindByID()
SetAttrByID()
ShowWindowByID()
CloseWindowByID()
FreeByID()
...


Die sind aber alle in einer seperaten Datei definiert und müssten streng genommen auch gar nicht in die ntui.library hinein, um Bloat zu vermeiden. Alls diese Funktionen kann man ja auch selbst definieren, z.b.
code:
void ShowWindowByID(String winId) {
  window *win = (window*)GetObjectByID(winId);
  SetAttr(win,TUIA_VISIBILITY,True);
}




--
--
Author of
HD-Rec, Sweeper, Samplemanager, ArTKanoid, Monkeyscript, Toadies, AsteroidsTR, TuiTED, PosTED, TKPlayer, AudioConverter, ScreenCam, PerlinFX, MapEdit, AB3 Includes und viele mehr...
Homepage: http://www.hd-rec.de



[ Dieser Beitrag wurde von Der_Wanderer am 19.07.2011 um 22:29 Uhr geändert. ]

[ Dieser Beitrag wurde von Der_Wanderer am 19.07.2011 um 22:36 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

19.07.2011, 22:32 Uhr

AGSzabo
Posts: 1663
Nutzer
@Der_Wanderer:

Dann kann man aber nur binden, was schon erzeugt wurde, es ist nicht möglich ein objekt zur bindung mit einem anderen schon zur erzeugungszeit vorzubestimmen. In Beispiel, du kannst dem scroller nicht sagen, hänge dich an diese view wenn sie fertig ist, sondern erst wenn die view fertig ist, geht das. man kann ja nicht wissen in welcher reihenfolge die gui elemente erzeugt werden...
--
Sam mini os4.1 upd. 2 / e-uae 39bb2 / A4000D 3.0 & 3.9 2mbchip 8mbfast Ariadne_II ide DVD und HD / A500 3.1 (mkick) adide 50mb / Athlon ii X2 Ubuntu Linux

[ Dieser Beitrag wurde von AGSzabo am 19.07.2011 um 22:34 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

19.07.2011, 22:42 Uhr

Der_Wanderer
Posts: 1229
Nutzer
Zitat:
Original von AGSzabo:
@Der_Wanderer:

Dann kann man aber nur binden, was schon erzeugt wurde, es ist nicht möglich ein objekt zur bindung mit einem anderen schon zur erzeugungszeit vorzubestimmen. In Beispiel, du kannst dem scroller nicht sagen, hänge dich an diese view wenn sie fertig ist, sondern erst wenn die view fertig ist, geht das. man kann ja nicht wissen in welcher reihenfolge die gui elemente erzeugt werden...
--
Sam mini os4.1 upd. 2 / e-uae 39bb2 / A4000D 3.0 & 3.9 2mbchip 8mbfast Ariadne_II ide DVD und HD / A500 3.1 (mkick) adide 50mb / Athlon ii X2 Ubuntu Linux

[ Dieser Beitrag wurde von AGSzabo am 19.07.2011 um 22:34 Uhr geändert. ]


Es reicht ja den Bind einmal anzugeben:

code:
<view id=myView>
<hscroller bind=myView>
<vscroller bind=myView>


Wo ist da das Problem?
Zugegeben, es ist ein wenig unschön, und deshalb sollte sich der Parser die Bindings merken und am Ende ausführen, damit auch das geht:


code:
<hscroller bind=myView>
<vscroller bind=myView>
<view id=myView>


Momentan geht das noch nicht, weil ich es nicht implementiert habe, stellt aber ja kein prinzipielles Problem dar.

--
--
Author of
HD-Rec, Sweeper, Samplemanager, ArTKanoid, Monkeyscript, Toadies, AsteroidsTR, TuiTED, PosTED, TKPlayer, AudioConverter, ScreenCam, PerlinFX, MapEdit, AB3 Includes und viele mehr...
Homepage: http://www.hd-rec.de


[ - Antworten - Zitieren - Direktlink - ]

19.07.2011, 22:49 Uhr

AGSzabo
Posts: 1663
Nutzer
@Der_Wanderer:

Dann gehst du doch über IDs beim binden. Angenommen, du möchtest eine Klasse aus zwei anderen Klassen bauen, deren objekte dann miteinander gebunden werden sollen. Das geht vermutlich garnicht über XML oder? Ich vermute, für diesen Fall hast du eine Funktion Bind(a,b)?
--
Sam mini os4.1 upd. 2 / e-uae 39bb2 / A4000D 3.0 & 3.9 2mbchip 8mbfast Ariadne_II ide DVD und HD / A500 3.1 (mkick) adide 50mb / Athlon ii X2 Ubuntu Linux

[ - Antworten - Zitieren - Direktlink - ]

20.07.2011, 00:55 Uhr

Holger
Posts: 8116
Nutzer
Zitat:
Original von Der_Wanderer:
Stimmt. Das liegt daran, dass
<vgroup ...> das gleiche ist wie <group orientation=vertical ...> und
<hgroup ...> das gleiche ist wie <group orientation=horizontal ...>.
Sind also einfach nur Abkürzungen, weil man das oft braucht.

Makro-XML? Das ist schon echt hart.
Zitat:
Zitat:
> <vgroup title='Item Options' bordertype=7/>

sollte nicht mit /> beendet werden.

Stimmt. Mein Parser ist da etwas großzügig.
In dem er offensichtlich falsches erlaubt? Mir scheint, Du hast einen der wesentlichen Vorteile von XML nicht verstanden.

Zitat:
Wenn kein Space enthalten ist, können die ".." wegfallen. Und man darf auch '..' verwenden. Das habe ich von HTML übernommen. Ich mache das, weil ich im Sourcecode das als String definiere und nicht immer die " escapen möchte.
Die Begründung überzeugt mich nicht. Du kannst ja einfache Anführungszeichen verwenden, das ist in XML erlaubt und die müssen normalerweise nicht escaped werden. Warum Du sie jetzt auch noch unbedingt weglassen musst, um zwei Zeichen einzusparen, erschließt sich mir nicht. Das hat ja mit escapen nichts zu tun.


Was mich aber noch mehr interessiert, was macht eigentlich </group fixwidth>? Attribute innerhalb eines schließenden Tags? Dein Parser ist wirklich verdammt tolerant, um nicht zu sagen, was auch immer er parst, es ist kein XML.
Zitat:
Wirklich? Gibts keine "Switches" die durch ihre blosse Anwesenheit etwas anschalten?
Es gibt in XML keine Attribute ohne Wertzuweisung, d.h. es müsste mindestens foo="" da stehen. Wobei die meisten Funktionen des DOM-API oder XPath, etc. bei einer Abfrage eines Attributwertes nicht zwischen einem nicht vorhandenem Attribut und einem Leerstring unterscheiden.

Man kann zwischen ihnen unterscheiden, entfernt sich aber von dem, was Standardwerkzeuge als typisch (und damit leicht zu benutzen) erachten.

Bedenke bitte, XML wurde dazu design't, maschinenlesbar zu sein, nicht zwangsläufig komfortabel für den Menschen.

Deine Optimierungen sind alle eher marginal, es stört kaum, wenn man immer formal korrekt <hgroup></hgroup> <vgroup></vgroup> und Anführungszeichen schreiben würde, aber wenn irgendwann mal jemand neue Features (wie wäre es mit einem GUI-Editor?) entwickelt, schaust Du blöd aus der Wäsche, wenn der scheinbar korrekte Code plötzlich nicht eingelesen werden kann, weil diese neue Software mit Deiner Interpretation von XML nicht klarkommt.

--
Good coders do not comment. What was hard to write should be hard to read too.

[ - Antworten - Zitieren - Direktlink - ]

20.07.2011, 01:10 Uhr

Holger
Posts: 8116
Nutzer
Zitat:
Original von AGSzabo:
Nee, das ist vielleicht ein bischen blöd, aber es muss tatsächlich zB

samewidth="samewidth"

heissen, wenn du die angaben true oder false vermeiden willst und auch nicht on oder off oder so verwenden willst.

Das ist auch nur eine hässliche Krücke, die die XML-Erfinder für XHtml eingeführt haben, mit dem unverständlichen Ziel, dass fehlerhafte Html-Parser XHtml lesen und wie eigentlich fehlerhaftes Html behandeln und verarbeiten können.

Es dürfte kaum eine andere XML-Anwendung geben, die solche Attribute nutzt.
Zitat:
ich finde es mit true oder false gut gelöst.
Das ist es.

--
Good coders do not comment. What was hard to write should be hard to read too.

[ - Antworten - Zitieren - Direktlink - ]

20.07.2011, 10:50 Uhr

Der_Wanderer
Posts: 1229
Nutzer
Zitat:
Original von AGSzabo:
@Der_Wanderer:

Dann gehst du doch über IDs beim binden. Angenommen, du möchtest eine Klasse aus zwei anderen Klassen bauen, deren objekte dann miteinander gebunden werden sollen. Das geht vermutlich garnicht über XML oder? Ich vermute, für diesen Fall hast du eine Funktion Bind(a,b)?
--
Sam mini os4.1 upd. 2 / e-uae 39bb2 / A4000D 3.0 & 3.9 2mbchip 8mbfast Ariadne_II ide DVD und HD / A500 3.1 (mkick) adide 50mb / Athlon ii X2 Ubuntu Linux


Nein, über XML kann man keine neuen Widget Klassen bauen. Das sind Amiga Shared Libraries von 3rd Party Entwicklern, so wie bei MUI, oder direkt im NTUI Sourcecode.
Über XML kann man nur Widgets binden, z.B. einen Scroller mit Arrows etc.
Wobei man das eigentlich relativ selten braucht, da die meisten Widgets schon sinnvolle Subwidgets erstellen können.
Z.b. braucht ein ListView keinen extra Scroller, da es bereits einen eigenen anlegt und sich damit bindet, ohne dass man was auf XML ebene dazu tun muss.
Auch bei Arrows von Scrollern. Da sagt man einfach:

<scroller orientation=vertical arrows=true/>

Der Scroller legt dann beim Inisitlaisieren selbständig schon Arrow Buttons an und bindet sich damit. Aber nehmen wir mal an, ich will einen Arrow ganz wo anders haben (wo anders im Fenster oder sogar in einem anderen Fenster), dann kann ich:

<scroller id=xxx orientation=vertical/>
<arrowup bind=xxx>
<arrowdown bind=xxx>

Ja, arrowup/down sind Widget Klassen, ein Subclass von Button.


--
--
Author of
HD-Rec, Sweeper, Samplemanager, ArTKanoid, Monkeyscript, Toadies, AsteroidsTR, TuiTED, PosTED, TKPlayer, AudioConverter, ScreenCam, PerlinFX, MapEdit, AB3 Includes und viele mehr...
Homepage: http://www.hd-rec.de


[ - Antworten - Zitieren - Direktlink - ]

20.07.2011, 11:14 Uhr

AGSzabo
Posts: 1663
Nutzer
@Der_Wanderer:

> Der Scroller legt dann beim Inisitlaisieren selbständig schon Arrow Buttons an und bindet sich damit.

Wie macht er das? Ich meine auf low level ebene ausgedrückt, kein self.bind oder sowas. also wie wird das ganz intern gehandhabt?

ps: achja, bei mir sind klassen tendentiell externe nachladesegmente. in der masterlibrary sind blos ein paar ganz allgemeine. das kann man aber ganz einfach umstellen, also eine klasse in die lib mit aufnehmen oder auslagern. es gibt auch funktionen wie MakeClass() um was ganz spezielles privates subclass zu erstellen zB.

--
Sam mini os4.1 upd. 2 / e-uae 39bb2 / A4000D 3.0 & 3.9 2mbchip 8mbfast Ariadne_II ide DVD und HD / A500 3.1 (mkick) adide 50mb / Athlon ii X2 Ubuntu Linux

[ Dieser Beitrag wurde von AGSzabo am 20.07.2011 um 11:18 Uhr geändert. ]

[ Dieser Beitrag wurde von AGSzabo am 20.07.2011 um 11:20 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

20.07.2011, 11:23 Uhr

Holger
Posts: 8116
Nutzer
Zitat:
Original von AGSzabo:
Wie macht er das? Ich meine auf low level ebene ausgedrückt, kein self.bind oder sowas. also wie wird das ganz intern gehandhabt?

Das hat er doch alles schon haarklein erklärt.

[ - Antworten - Zitieren - Direktlink - ]

20.07.2011, 11:27 Uhr

AGSzabo
Posts: 1663
Nutzer
@Holger:

sorry, ibindum. ich schaue nochmal nach...
--
Sam mini os4.1 upd. 2 / e-uae 39bb2 / A4000D 3.0 & 3.9 2mbchip 8mbfast Ariadne_II ide DVD und HD / A500 3.1 (mkick) adide 50mb / Athlon ii X2 Ubuntu Linux

[ - Antworten - Zitieren - Direktlink - ]

20.07.2011, 11:29 Uhr

Der_Wanderer
Posts: 1229
Nutzer
Zitat:
Original von Holger:
Zitat:
Original von Der_Wanderer:
Stimmt. Das liegt daran, dass
<vgroup ...> das gleiche ist wie <group orientation=vertical ...> und
<hgroup ...> das gleiche ist wie <group orientation=horizontal ...>.
Sind also einfach nur Abkürzungen, weil man das oft braucht.

Makro-XML? Das ist schon echt hart.
Es sind ja keine Makros. Eine V und H Group unterscheidet sich aber nur durch den Orientation Parameter, es ist die gleiche Klasse.
Und da man Gruppen sehr häufig braucht, kann man das direkt erzeugen ohne explizite Angabe des Parameters. Die Gruppen zu schliessen ist aber das gleiche, weil es ja die gleiche Klasse ist. Der Parser kennt aber auch </hgroup> und </vgroup>, wenn man es so will.

Zitat:
Zitat:
Zitat:
> <vgroup title='Item Options' bordertype=7/>

sollte nicht mit /> beendet werden.

Stimmt. Mein Parser ist da etwas großzügig.
In dem er offensichtlich falsches erlaubt? Mir scheint, Du hast einen der wesentlichen Vorteile von XML nicht verstanden.
Stimmt, in dem Fall oben ist das tatsächlich falsch. Man könnte ja auch eine leere Gruppe erstellen wollen. Das sollte ich berücksichtigen.

Zitat:
Zitat:
Wenn kein Space enthalten ist, können die ".." wegfallen. Und man darf auch '..' verwenden. Das habe ich von HTML übernommen. Ich mache das, weil ich im Sourcecode das als String definiere und nicht immer die " escapen möchte.
Die Begründung überzeugt mich nicht. Du kannst ja einfache Anführungszeichen verwenden, das ist in XML erlaubt und die müssen normalerweise nicht escaped werden. Warum Du sie jetzt auch noch unbedingt weglassen musst, um zwei Zeichen einzusparen, erschließt sich mir nicht. Das hat ja mit escapen nichts zu tun.

align=right

tippt sich einfach schneller als

align='right'

Und wenn kein Leerzeichen vorkommt, ist das Ende des Strings ja definiert. So wie bei CLI Parametern, oder HTML.
Das führt ja nicht zu Problemen wenn man es korrekt macht, vermeidet aber tonnenweise Fehlermeldungen bei faulen Programmierern.

Zitat:
Was mich aber noch mehr interessiert, was macht eigentlich </group fixwidth>? Attribute innerhalb eines schließenden Tags? Dein Parser ist wirklich verdammt tolerant, um nicht zu sagen, was auch immer er parst, es ist kein XML.
Ja, er ist verdammt tolerant ;-)
Das hat eine einfache Bewandtnis:
Ob eine Gruppe fix oder sizable ist, hängt davon ab ob seine Kinder sizable oder fix sind. Das wird rekursiv hoch-propagiert bis zum Fenster. So hat z.b. ein Fenster, das nur fixe Elemente enthält, per default kein Size Gadget. Sobald eines der Kinder sizable ist, bekommt es ein Size Gadget.
Manchmal will man das verhalten aber überschreiben, weil man eine Gruppe explizit fix machen will.
Mache ich das beim Erstellen der Gruppe, existieren noch keine Kinder.
Das Default verhalten wird erst nach schließen der Gruppe bestimmt.
Da der Parser momentan noch nicht vorausschaut, muss ich also das fix beim Schließen der Gruppe erzwingen.



Zitat:
Zitat:
Wirklich? Gibts keine "Switches" die durch ihre blosse Anwesenheit etwas anschalten?
Es gibt in XML keine Attribute ohne Wertzuweisung, d.h. es müsste mindestens foo="" da stehen. Wobei die meisten Funktionen des DOM-API oder XPath, etc. bei einer Abfrage eines Attributwertes nicht zwischen einem nicht vorhandenem Attribut und einem Leerstring unterscheiden.
"Meinem" Parser ist es egal, ob foo oder foo=x oder foo="true" da seht. Er parst den Parameter Namen und Wert. Wenn kein "=" da ist, dann ist der Wert der Leere String.

Zitat:
Man kann zwischen ihnen unterscheiden, entfernt sich aber von dem, was Standardwerkzeuge als typisch (und damit leicht zu benutzen) erachten.

Bedenke bitte, XML wurde dazu design't, maschinenlesbar zu sein, nicht zwangsläufig komfortabel für den Menschen.

XML wurde eigentlich desgined, um die Krätsche zwischen Human and Maschin Readable hinzubekommen.

Zitat:
Deine Optimierungen sind alle eher marginal, es stört kaum, wenn man immer formal korrekt <hgroup></hgroup> <vgroup></vgroup> und Anführungszeichen schreiben würde, aber wenn irgendwann mal jemand neue Features (wie wäre es mit einem GUI-Editor?) entwickelt, schaust Du blöd aus der Wäsche, wenn der scheinbar korrekte Code plötzlich nicht eingelesen werden kann, weil diese neue Software mit Deiner Interpretation von XML nicht klarkommt.
Das war nur mein XML Text. Der Parser kann natürlich auch korrektes XML parsen, nur ich kanns nicht schreiben, deshalb verzeiht der Parser mir den ein oder anderen Ausrutscher ;-)


--
--
Author of
HD-Rec, Sweeper, Samplemanager, ArTKanoid, Monkeyscript, Toadies, AsteroidsTR, TuiTED, PosTED, TKPlayer, AudioConverter, ScreenCam, PerlinFX, MapEdit, AB3 Includes und viele mehr...
Homepage: http://www.hd-rec.de


[ - Antworten - Zitieren - Direktlink - ]

20.07.2011, 13:10 Uhr

Holger
Posts: 8116
Nutzer
Zitat:
Original von Der_Wanderer:
Es sind ja keine Makros.

Es verhält sich aber so. Als ob "<vgroup" ein Makro für "<group orientation='vertical'" wäre. Wobei, natürlich nicht ganz, wenn Du es auch via "</vgroup>" schließen kannst.
Zitat:
Die Gruppen zu schliessen ist aber das gleiche, weil es ja die gleiche Klasse ist. Der Parser kennt aber auch </hgroup> und </vgroup>, wenn man es so will.
Zusammen mit den anderen Dingen, die er toleriert, ist das Erlauben von eigentlich nicht übereinstimmenden Tags eine Zeitbombe. Es wäre gar nicht schwer, ein Beispiel zu konstruieren, bei dem nicht mehr klar ist, wie der Parser das interpretiert.
code:
<vgroup/> beliebiger Content <hgroup/> beliebiger Content </group>

Ich denke, Du weißt selbst, dass hier das schlimmste, das passieren kann, wäre, dass es auf den ersten Blick das tut, was der Programmierer wollte.

Wozu brauchst Du überhaupt die Definition von <group orientation=...>, wenn Du es nie benutzt? Definiere doch nur vgroup und hgroup, mit passenden End-Tags natürlich, und fertig.

Zitat:
align=right

tippt sich einfach schneller als

align='right'

Wie oft tippst Du das?
Zitat:
Das führt ja nicht zu Problemen wenn man es korrekt macht, vermeidet aber tonnenweise Fehlermeldungen bei faulen Programmierern.
Die kommen dann zu einem anderen Zeitpunkt.

Zitat:
"Meinem" Parser ist es egal, ob foo oder foo=x oder foo="true" da seht. Er parst den Parameter Namen und Wert. Wenn kein "=" da ist, dann ist der Wert der Leere String.
Im Rest der Welt wird zwischen dem Parser und der eigentlichen Anwendung unterschieden. Deshalb gibt es auch keine Toleranz im XML-Parser, die bei einer bestimmten Anwendung vielleicht einen Sinn ergeben würde.

Deshalb bezog ich mich auch nicht auf die Frage, was der Parser macht, wenn ein Attribut ohne Wertzuweisung auftaucht, sondern darauf, dass die meisten Anwendungen das Ergebnis des Parsers über Funktionen abfragen, die im Falle eines nicht vorhandenen Attributs einen Leerstring zurückgeben, womit keine Unterscheidung zwischen explizit zugewiesenem Leerstring oder nicht vorhandenem Attribut stattfindet.

Allerdings setzt ein validierender Parser natürlich für nicht angegebene optionale Attribute den Default-Wert ein, der in der DTD oder im Schema deklariert wurde, wenn es das gibt. Für bool'sche Schalter kann man somit natürlich einen Fall immer weglassen, bei clever gewähltem Default natürlich den häufiger auftretenden.
Zitat:
XML wurde eigentlich desgined, um die Krätsche zwischen Human and Maschin Readable hinzubekommen.
Genau. Und die Trennlinie wurde anders gezogen, als Du es gerade bevorzugst. Die halbe Sekunde, die man durch das Weglassen einfacher Anführungszeichen bei der manuellen Eingabe einspart, wurde zugunsten der Stunden Fehlersuche im XML-Parser geopfert.
Zitat:
Das war nur mein XML Text. Der Parser kann natürlich auch korrektes XML parsen, nur ich kanns nicht schreiben, deshalb verzeiht der Parser mir den ein oder anderen Ausrutscher ;-)
Ja, er erzieht Dich zur Bequemlichkeit und zur Produktion von einem Haufen fehlerhaften XML, das, wie gesagt, Dir möglicherweise zu einem anderen Zeitpunkt mächtig auf die Füße fallen wird.

Wenn Du es schon bequem haben willst, dann lass Dir von Deinem Parser nach dem toleranten Verarbeitungsprozess das äquivalente korrekte XML ausgeben und kopiere das in Deine Anwendung, auf dass die Fehler ein für alle Mal bereinigt sind. Und implementiere einen nicht-toleranten Modus für die finale Anwendung.


--
Good coders do not comment. What was hard to write should be hard to read too.

[ - Antworten - Zitieren - Direktlink - ]

20.07.2011, 14:11 Uhr

Der_Wanderer
Posts: 1229
Nutzer
@Holger

Also wenn das hier korrekt geparsed wird, wäre das ok?

code:
<window id="xuiwin" title="NTUI Lib Info & Config PREVIEW" bgpen="halfshadow">
  <vgroup>
    <tabview activetab="1" bgpen="background">
      <vgroup title="Information" image="TBImages:help"/>
      <vgroup title="Configuration" image="TBImages:prefs">
        <hgroup>
          <vgroup title="NTUI Env Variables" bordertype="title">
            <listview title="\pTBImages:question\~|\lVariables|\lValue" id="xuilist"/>
          </vgroup>
          <vgroup title="Item Options" bordertype="title" fixwidth="true">
            <hgroup><checkbox/><label text="active (use pen if not)" align="left" fixwidth="false"/></hgroup>
            <hgroup wrap="2">
              <label text="Web/Hex" align="right"/><string text="AEBF34"/>
              <label text="Red" align="right"/><string text="231"/>
              <label text="Green" align="right"/><string text="81"/>
              <label text="Blue" align="right"/><string text="132"/>
            </hgroup>
            <hgroup bordertype="recessed"><label text="Preview" bgpen="marker"/></hgroup>
            <image src="Desktop:/Pictures/ColorWheel2.png"/>
          </vgroup>
        </hgroup>
        <hgroup bordertype="recessed" samewidth="true">
          <button text="Cancel"/>
          <button text="Revert"/>
          <button text="Default"/>
          <button text="Test"/>
          <button text="Save"/>
          <button text="Use"/>
        </hgroup>
      </vgroup>
    </tabview>
  </vgroup>
</window>


Noch eine Frage:

Bei Tags, die eigentlich nichts umklammern können, z.b. eine CheckBox, benötigt man das /> als Ende?
Das finde ich ziemlich lästig, da ich HTML gewöhnt bin.

Ich habe auch später nicht wirklich vor, komplexere GUIs per Hand zu schreiben, dafür würde ich eine GUI Builder machen, wo man zwischen Tree Ansicht und XML Code hin und her schalten kann. (und natürlich die GUI noch als Preview sofort sehen kann.


--
--
Author of
HD-Rec, Sweeper, Samplemanager, ArTKanoid, Monkeyscript, Toadies, AsteroidsTR, TuiTED, PosTED, TKPlayer, AudioConverter, ScreenCam, PerlinFX, MapEdit, AB3 Includes und viele mehr...
Homepage: http://www.hd-rec.de


[ - Antworten - Zitieren - Direktlink - ]

20.07.2011, 14:13 Uhr

AGSzabo
Posts: 1663
Nutzer
@Der_Wanderer:

/> gibts auch in HTML, zB <img /> oder <br />. du tippst dann weniger ;) .
--
Sam mini os4.1 upd. 2 / e-uae 39bb2 / A4000D 3.0 & 3.9 2mbchip 8mbfast Ariadne_II ide DVD und HD / A500 3.1 (mkick) adide 50mb / Athlon ii X2 Ubuntu Linux

[ - Antworten - Zitieren - Direktlink - ]

20.07.2011, 16:04 Uhr

Holger
Posts: 8116
Nutzer
Zitat:
Original von AGSzabo:
/> gibts auch in HTML, zB <img /> oder <br />. du tippst dann weniger ;) .

Nein, das ist xhtml. Bei html brauchst Du bei diesen Elementen weder einen / im Tag, noch einen schließenden Tag. Diese haben per se keinen Inhalt.

--
Good coders do not comment. What was hard to write should be hard to read too.

[ - Antworten - Zitieren - Direktlink - ]

20.07.2011, 16:19 Uhr

Holger
Posts: 8116
Nutzer
Zitat:
Original von Der_Wanderer:
Also wenn das hier korrekt geparsed wird, wäre das ok?

Nun, das & Zeichen muss für konformes XML als & geschrieben werden, ansonsten passt es. Du kannst die Korrektheit übrigens auch selbst überprüfen, in dem Du die Datei in einem Browser öffnest. Jeder aktuelle Browser hat einen XML-Parser. Gegebenenfalls musst Du noch den Prolog <?xml version="1.0"?> voranstellen, um den Parser glücklich zu machen.

Zitat:
Noch eine Frage:

Bei Tags, die eigentlich nichts umklammern können, z.b. eine CheckBox, benötigt man das /> als Ende?
Das finde ich ziemlich lästig, da ich HTML gewöhnt bin.

Um Tags automatisch zu schließen, müsste der Parser wissen, welche Tags grundsätzlich keinen Content haben. Also müsstest Du eine DTD oder ein Schema oder ähnliches geschrieben haben, was ich bezweifle. Davon ungeachtet hat man bei XML wiederum den für Parser einfacheren Weg gewählt und verlangt grundsätzlich diesen Slash, der ja nun wirklich nicht weh tut. Stell Dir mal vor, Du müsstest jedesmal <checkbox></checkbox> schreiben.

Wenn Du weniger schreiben willst, erlaube dem checkbox-Element, die Eigenschaften des zugehörigen Labels aufzunehmen. Checkboxen ohne Label sind ziemlich selten…
Zitat:
Ich habe auch später nicht wirklich vor, komplexere GUIs per Hand zu schreiben, dafür würde ich eine GUI Builder machen, wo man zwischen Tree Ansicht und XML Code hin und her schalten kann. (und natürlich die GUI noch als Preview sofort sehen kann.
Na dann…

--
Good coders do not comment. What was hard to write should be hard to read too.

[ - Antworten - Zitieren - Direktlink - ]

20.07.2011, 16:48 Uhr

AGSzabo
Posts: 1663
Nutzer
Mein xml parser unterstützt alles was holger aufgezählt hat. und auch regeln.

--
Sam mini os4.1 upd. 2 / e-uae 39bb2 / A4000D 3.0 & 3.9 2mbchip 8mbfast Ariadne_II ide DVD und HD / A500 3.1 (mkick) adide 50mb / Athlon ii X2 Ubuntu Linux

[ - Antworten - Zitieren - Direktlink - ]


1 2 3 -4- [ - Beitrag schreiben - ]


amiga-news.de Forum > Programmierung > OOP-GUI Systeme und Content-Clipping [ - Suche - Neue Beiträge - Registrieren - Login - ]


.
Impressum | Datenschutzerklärung | Netiquette | Werbung | Kontakt
Copyright © 1998-2024 by amiga-news.de - alle Rechte vorbehalten.
.