[Alg] Hoe pak jij je dialogen aan?

Pagina: 1
Acties:
  • 127 views sinds 30-01-2008
  • Reageer

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

Topicstarter
(overleden)
Afbeeldingslocatie: http://msdn.microsoft.com/library/en-us/UxGuide/UXGuide/Windows/DialogBoxes/images/Dialogs_38.jpgTijdens het devven van (winforms-)applicaties loop ik meestal tegen het feit aan dat ik een confirmatie dialoog of andere "simpele dialoog" nodig heb voor het 1 of ander. Soms voldoet een standaard messagebox prima voor dit doel, maar soms ook niet. Soms moet de gebruiker een waarde kiezen uit een dropdown (array met waardes, records uit een tabel; dat soort dingen), soms wil je juist een messagebox met een "vraag niet opnieuw"-checkbox.

Andere keren wil je dat er 2 of meer checkboxes worden weergegeven, dat er enkel een cijfer (datum, postcode, etc.) kan worden ingevoerd. Of je wil dat de gebruiker kiest uit een aantal keuzes (afsluiten, opnieuw opstarten, afmelden) met behulp van wat radio buttons. Of een combinatie van één of meer van voorgaande. En dan altijd vergezeld van een OK/Annuleren knopje. Of een Ja/Nee knopje. Of een Ja/Nee/Alles. Of Negeren, Opnieuw, Annuleren. Anyway, you get my drift ;)

Nu heb ik een ontzettende schurft aan 24 verschillende forms in mijn project die elk maar voor 1 simpel doel dienen, of die hooguit een paar keer gebruikt worden. Het is moeilijk(er) te onderhouden, veroorzaakt "clutter" in mijn project en code en dat allemaal voor die ene simpele confirmatie. Wat ik dan doe is een "dynamisch" dialoog-venster bouwen dat een bult properties (caption, question, style, icon, ...) en methods (addButton, addCheckbox, addInputbox, addDropdown, ...) kent om 'm dusdanig weer te kunnen geven zodat 'ie voldoet aan mijn eisen. Nu heb ik wel een redelijk veelgebruikte "MsgBoxEx" liggen, maar ook die voldoet soms (nog steeds niet) aan alle eisen.
Afbeeldingslocatie: http://img.microsoft.com/library/media/1033/technet/images/archive/winntas/tips/techrep/dulbootk.gif


Afbeeldingslocatie: http://www.win-test.com/ref_manual/en/images/editDeleteAllQso.gifMomenteel ben ik met een project bezig en heb ik wederom een dozijn ofzo van die confirmatie schermpjes nodig. En ik betrap er mezelf op dat ik wéér zo'n dynamische "MsgBoxEx" aan 't bouwen ben omdat "die andere" niet re-usable genoeg is. Maar wat mij stoort is dat ik mezelf er op betrap dat ik er helemaal in doorsla: Ik zal het nevernooit niet gebruiken, maar ik geef 't ding wel properties als maxButtonsPerCol (maximum aantal knoppen in de breedte, daarna "wrap" naar een nieuwe "regel" met buttons...want stél dat je een keer 8+ buttons wil, dan wil je die natuurlijk mooi weergeven in 2 rijen van 4 etc :X ), checkboxCols (aantal "kolommen" van checkboxes, stel dat het er meer dan 5 zijn bijv), maxCheckboxWidth (max. breedte van een checkbox + bijbehorend label) enzovoorts enzovoorts. En ook qua methods is dat niet anders.


Uiteindelijk is juist het idee dat 't ding dynamisch moet zijn de oorzaak van een dusdanig complexe "dialoog" dat het bijna een project an sich wordt :P (Lichtelijk overdreven, maar you get my point). Zelfs als ik niet zo zou doorslaan heb je nog steeds het feit dat je toch iets moet bouwen voor al deze simpele interactie met de gebuiker. En ik hou me liever met belangrijkere zaken bezig, maar dit moet ook gebeuren (zeker als je als "one man show" werkt ;) ).Afbeeldingslocatie: http://www.microsoft.com/library/media/1033/technet/images/security/topics/identitymanagement/smrtcdcb/sec3/smar1008_big.gif


Afbeeldingslocatie: http://www.microsoft.com/windowsme/images/imgdl_dialog.gifWat ik me afvraag is hoe andere tweak-devvers dit aanpakken. Maken jullie voor ieder afwijkend dialoogje een nieuw form met daar de benodigde controls op? Of gebruiken jullie ook een home-made solution hiervoor zoals een "dynamische MsgBox"? En hoever "slaan jullie daarin door"? Gebruiken jullie misschien een 3rd party oplossing? En zitten jullie er ook altijd tegen aan te hikken om aan dit soort "simpele taakjes" te devven? (Ik stel het altijd zo lang mogelijk uit, maar tegen het einde is er vaak geen ontkomen meer aan :P )


Ik heb er al eens over zitten denken om een "ultimate" MsgBox component te maken, maar ik kom dusdanig vaak verschillende benodigde functionaliteit tegen dat het (bijna) niet te vangen is in een "ultimate" component ofzo

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • Invisible_man
  • Registratie: Juni 2006
  • Laatst online: 14-02 09:15
Ik maak er zelf wel altijd apparte forms van. Maar daarbij copy-paste ik wel een bult code uit oudere forms. In de praktijk ben je in een kwartiertje dan ook wel klaar met z'n dialoog.

Als het wat te druk wordt met al die forms/classes, kan je je dialogen ook wel in een ander project zetten voor de overzichtelijkheid.

  • Aloys
  • Registratie: Juni 2005
  • Niet online
meestal probeer ik gebruik te maken van de standard dialogen.... maar ik zit ook wel es met dit zelfde probleem.... dus ik blijf ff meelezen :P

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

Topicstarter
(overleden)
Invisible_man schreef op woensdag 19 juli 2006 @ 12:15:
Ik maak er zelf wel altijd apparte forms van. Maar daarbij copy-paste ik wel een bult code uit oudere forms. In de praktijk ben je in een kwartiertje dan ook wel klaar met z'n dialoog.
:w Bye-bye maintainability, re-usability etc ;) Met copy-paste code loop ik het risico dat ik bij een wijziging alle dialogs na mag gaan lopen. Nu zal dat doorgaans niet zo complex zijn, of uberhaupt nodig zijn, maar toch gaat dat tegen mijn "gevoel" in.

[ Voor 6% gewijzigd door RobIII op 19-07-2006 12:18 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • J2pc
  • Registratie: Oktober 2002
  • Niet online

J2pc

UT Tux Edition

RobIII schreef op woensdag 19 juli 2006 @ 12:17:
[...]

:w Bye-bye maintainability, re-usability etc ;) Met copy-paste code loop ik het risico dat ik bij een wijziging alle dialogs na mag gaan lopen. Nu zal dat doorgaans niet zo complex zijn, of uberhaupt nodig zijn, maar toch gaat dat tegen mijn "gevoel" in.
puh, een echte beta doet niet aan gevoel :p

"The computer is incredibly fast, accurate, and stupid. Man is unbelievably slow, inaccurate, and brilliant. The marriage of the two is a challenge and opportunity beyond imagination." © Stuart G. Walesh


  • kenneth
  • Registratie: September 2001
  • Niet online

kenneth

achter de duinen

Copy-paste = code stench :X :D

En verder ben ik zelf heel erg een voorstander van Apple-style dialogen:
Als u nu niet de wijzigingen verloren laat gaan, zal het bestand niet opgeslagen verloren gaan worden!!!
En dan ipv "Ja/Nee" netjes "Opslaan/Niet Opslaan/Annuleren"

Look, runners deal in discomfort. After you get past a certain point, that’s all there really is. There is no finesse here.


  • Garyu
  • Registratie: Mei 2003
  • Laatst online: 19:01

Garyu

WW

kenneth schreef op woensdag 19 juli 2006 @ 12:26:
Copy-paste = code stench :X :D

En verder ben ik zelf heel erg een voorstander van Apple-style dialogen:
Als u nu niet de wijzigingen verloren laat gaan, zal het bestand niet opgeslagen verloren gaan worden!!!
En dan ipv "Ja/Nee" netjes "Opslaan/Niet Opslaan/Annuleren"
Inderdaad, een heel leesbare foutmelding :X :+

It's Difficult to Make Predictions - Especially About the Future


  • MTWZZ
  • Registratie: Mei 2000
  • Laatst online: 13-08-2021

MTWZZ

One life, live it!

Gewoon een base-dialog maken waar je een panel in maakt voor de content en die gaan overerven.

Nu met Land Rover Series 3 en Defender 90


  • Wim-Bart
  • Registratie: Mei 2004
  • Laatst online: 10-01-2021

Wim-Bart

Zie signature voor een baan.

Maak altijd gebruik van standaard dialoog boxen en als die niet voldoen dan maken we gewoon een nieuw form. Tijd die ik moet besteden aan een "dialoogbox" project weegt niet op tegen een standaard sleur en pleur actie.

Beheerders, Consultants, Servicedesk medewerkers. We zoeken het allemaal. Stuur mij een PM voor meer info of kijk hier De mooiste ICT'er van Nederland.


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

Topicstarter
(overleden)
MTWZZ schreef op woensdag 19 juli 2006 @ 12:46:
Gewoon een base-dialog maken waar je een panel in maakt voor de content en die gaan overerven.
Doe ik / heb ik ook. Maar dan nog zijn er dusdanig veel "verschillende" dialoogjes die net geen eigen form waard zijn (IMHO) dat het erg moeilijk is te besluiten wat nou beter is.
wim-bart schreef op woensdag 19 juli 2006 @ 12:53:
Maak altijd gebruik van standaard dialoog boxen en als die niet voldoen dan maken we gewoon een nieuw form.
Daarom heten ze ook common dialogs (open/save(as)/print/etc.) :Y) Maar zoals je in mijn TS kunt zien zijn er niet altijd geschikte kant-en-klaar dialogen...
wim-bart schreef op woensdag 19 juli 2006 @ 12:53:
Tijd die ik moet besteden aan een "dialoogbox" project weegt niet op tegen een standaard sleur en pleur actie.
Als het bij sleuren en pleuren bleef wel. Maar er moet soms ook nog logic achter. En dan heb ik die liever in het aanroepende form als in de dialog. En als ik bij iedere scheet een nieuw form maak wordt het er niet beheersbaarder op (IMHO).

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • Crazy D
  • Registratie: Augustus 2000
  • Laatst online: 16:03

Crazy D

I think we should take a look.

Misschien moet je je afvragen of je bepaalde zaken niet op een andere manier kunt oplossen? Zonder concreet voorbeeld is het natuurlijk lastig een alternatief te bedenken ;) Maar een confirmation waarbij je nog een selectie moet maken uit een dropdown of checkbox-jes, misschien die input verplaatsen naar het formulier waarin die confirmation gebruikt wordt? (werkt uiteraard alleen als dit maar op 1 plaats is). Of de structuur misschien iets aanpassen zodat bepaalde dingen niet via een messagebox verlopen maar gewoon vanuit het form zelf te sturen is.

Ik heb eigenlijk alleen de eenvoudige confirmations nodig als ja/nee en ok/cancel, de gewone messagebox voldoet voor mij meestal prima. Die hele enkele keer maak ik er gewoon nieuw formpje van, misschien niet de allermooiste technische oplossing maar prakitisch gezien heb je in een paar minuten het formpje wat je wilt en kun je verder met waar het echt om draait...

Maar ik denk dat als je zoveel variaties nodig hebt het geen slecht idee is om eens wat tijd te steken in een generieke box die via params aan te sturen is. En die kun je altijd als base gebruiken als je nog eens echt ingewikkeld popupje nodig hebt :) Als je 9 van de 10 keer er wel gebruik van kunt maken lijkt me dat al voldoende...

Al is het de vraag in hoeverre je in de praktijk die messageboxjes allemaal moet gaan aanpassen... en als je uit ervaring weet dat x of y aangepast moet worden, zou je dat misschien weer via een setting kunnen oplossen (kan er zo geen 1 bedenken, maar lekker cliche: bedrijfsnaam of logootje... kan je hard in de msgbox-form opnemen maar ook uit een setting laten komen).

Exact expert nodig?


  • JKVA
  • Registratie: Januari 2004
  • Niet online

JKVA

Design-by-buzzword fanatic

Ik stel voor: Decorator pattern. :)

[ Voor 29% gewijzigd door JKVA op 19-07-2006 18:34 ]

Fat Pizza's pizza, they are big and they are cheezy


Verwijderd

Ik gebruik altijd een dynamisch opgebouwd form, in zowel Delphi als .NET WinForms als in ASP.NET. Dat is ooit begonnen als een form om parameters voor (Crystal) rapporten te vragen, en die parameters kunnen vanalles zijn: textbox, dropdown (al dan niet gevuld vanuit een tabel of uit een vaste lijst opties), datetimepicker, checkbox, textarea voor uitleg, enz. enz.

Maar of je die parameters nu uit een rapport haalt of 'm zelf een lijst parameters aanbiedt maakt natuurlijk niets uit. Voor een aantal vaak gebruikte dialogs heb ik er wel afgeleides van gemaakt die zelf in de constructor al de parameterlijst aanmaken, maar voor dialogs die op 1 plek worden gebruikt moet de routine die de dialog aanroept ook de parameterlijst aanbieden (of de rapportnaam natuurlijk).
Werkt erg prettig. :)

  • whoami
  • Registratie: December 2000
  • Laatst online: 00:19
JKVA schreef op woensdag 19 juli 2006 @ 18:34:
Ik stel voor: Decorator pattern. :)
Geef eens een voorbeeldje hoe je dat pattern hier zou toepassen, ipv gewoon de naam te roepen. :)

https://fgheysels.github.io/


  • JKVA
  • Registratie: Januari 2004
  • Niet online

JKVA

Design-by-buzzword fanatic

whoami schreef op woensdag 19 juli 2006 @ 19:38:
[...]

Geef eens een voorbeeldje hoe je dat pattern hier zou toepassen, ipv gewoon de naam te roepen. :)
Ehm, ik heb niet zo veel tijd, maar goed, wie a zegt moet b zeggen. :P

Ik zat in mijn hoofd met zoiets.

Je hebt het Decorator pattern, dus je kunt @runtime bijvoorbeeld een scherm (of dialog) decoreren met allemaal toeters en bellen. Plus je voorkomt een combinational explosion.

Hoe?
http://www.exciton.cs.ric...erns/DecoratorPattern.htm

Zie plaatje.

AComponent is dan een abstracte Dialog klasse of interface.
ConcreteComponent is een subklasse ervan en stelt je (lege) Dialog voor.
Decorator lijkt me duidelijk
ConcreteDecoratorA, B, C t/m ... zijn Decorators die iets toevoegen aan je Dialog, bijvoorbeeld een Ok knop, Dropdown o.i.d.

Blijft doStuff Over.
In je Dialog is dat dan de code die a) de Dialog maakt of b) de Dialog rendert.
Dat zou ik in je Decorators implementeren als een methode die a) een component toevoegt aan je Dialog of b) echt iets rendert.

Je maakt je dialog dan uiteindelijk aan met zoiets:
Java:
1
2
3
4
5
6
7
Dialog myDialog = new DropDownDecorator(
    new ComboDecorator(
        new OkOrCancelButtonGroupDecorator(
            new Dialog()
        )
    )
);


Blijven op het eerste gezicht twee issues over.
a) Het mooi renderen van je Dialog als je gekke combi's wil. In Java kun je er een LayoutManager voor definieren, voor Win32 weet ik het even niet.
b) Een nette afhandeling van events. Zou je eventueel in de Decorators zelf kunnen coderen of ervan afwijken door ze te subklassen. Of iets zoals in Swing met ActionListeners.
Dus zoiets:
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Client implements DialogEventListener, OkOrCancelButtonGroupListener, ComboListener {

    private void createDlg() {
        Dialog myDialog = new Dialog();
        myDialog.addDialogEventListener(this);
        Decorator okCancel = new OkOrCancelButtonGroupDecorator(myDialog);
        okCancel.addOkOrCancelButtonGroupListener(this);
        Decorator combo = new ComboDecorator(okCancel);
        combo.addComboListener(this);
    }

    public void processDialogEvent(Event e) {
        // doe iets met die e
    }

    // Overige listener methoden, plus de rest van de klasse
}


Ik heb dit maar even snel ingeklopt, dus er kunnen wel wat kromme dingen in staan.

Fat Pizza's pizza, they are big and they are cheezy

Pagina: 1