[VB6] Alle properties van 1 type in een keer weergeven

Pagina: 1
Acties:

  • roy-t
  • Registratie: Oktober 2004
  • Laatst online: 17-10 16:43
Hallo mede-tweakers, ik heb een klein probleempje, niet echt een probleem zelfs, maar als ik dit zo zou kunnen doen zou ik heeeel veel zinloos typwerk kunnen besparen.

ik heb een heleboel typen gedeclareerd in een module zoiets als dit:

Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
Public Type OV_Vestiging
    ID As Integer
    Naam As String * 50
    Adres As String * 50
    Postcode As String * 50
    Telefoonnummers As String * 50
    Bouwjaar As Date
    InGebruikNameDatum As Date
    Plaats As String * 50
    Plaatsen As Integer
    LaatstGewijzigd As String * 20
    
End Type


Nu wil ik in 1x al de eigenschappen in een tekstvakje onder elkaar zetten, (ID, Naam, Adres etc.)

Ik zat zelf aan een contructie te denken als
Visual Basic:
1
2
3
4
5
Dim Vest as OV_Vestiging
'eigenschapjes in vest stoppen, of laden uit een bestand... 
for i = 1 to 10
txt1.text = txt1.text & Vest.(i) & vbcrlf
next i  


Mijn probleem is namelijk dat ik veel typen heb met soms wel 30 eigenschappen, en omdat nu allemaal zelf te gaan typen als ik een snelle uitvoer nodig heb...

Ik heb al gezocht op google, maar ik weet eigenlijk noet goed hoe ik dit zou moeten noem, vb6 print all type is niet echt een goede searchstring denk ik. Dus ik hoopte dat iemand me een duwtje (vlinke schop ;) ) in de juiste richting kan geven. Anders kan ik lekker honderden hersenloze regels code gaan schrijven :(

~ Mijn prog blog!


  • Padschild
  • Registratie: September 2004
  • Laatst online: 28-11-2020
Ik weet niet zeker of dit het is wat je bedoelt:

http://msdn2.microsoft.com/en-us/library/aky14axb.aspx (wel even filteren op VB)

  • pjonk
  • Registratie: November 2000
  • Laatst online: 22-11 20:39
@PadSchild:
GetProperties is een method uit het .NET Framework dus dat gaat helaas niet werken in VB6.

@TS:
Op zich is het idee van PadSchild om Reflection te gebruiken wel een logische gedachte, maar aangezien VB6 zeer beperkte Reflection ondersteuning heeft wordt dat lastig. Indien de applicatie is gecompiled naar een EXE zijn namelijk alle velden in je types niets meer dan verwijzingen naar geheugenadressen en de veldnamen zijn at run-time niet meer bekend. Daarom is het onmogelijk om at run-time te bepalen welke velden er in de type zitten. Daarbij is dynamic invocation niet mogelijk bij VB6 types, dit werkt alleen voor methods en properties.
Met VB.NET is veel meer mogelijk omdat de .NET compiler altijd meta-data van public types opslaat in de executable.

Volgens mij is het in VB6 ook niet mogelijk om alle properties van een class op te vragen, zie de link hieronder:
http://www.experts-exchan...ual_Basic/Q_21491527.html

Je zou misschien nog iets met CallByName kunnen doen, maar dan zul je ook alle Types moeten converteren naar Classes and that's a hell of a job.

It’s nice to be important but it’s more important to be nice


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Ik denk dat je met CopyMemory het block van de "struct" wel in een string kunt kopiëren; ik vermoed dat de strings null-terminated zijn dus als je die vervangt door een CrLf dan zou je het (theoretisch) in een textbox moeten kunnen weergeven :Y)
Als ik morgen tijd heb zal ik eens kijken of dat lukt.

Uiteraard gaat dat alleen met strings lukken trouwens (en het is nogal ranzig en da's nog zacht uitgedrukt :X )

[ Voor 22% gewijzigd door RobIII op 01-01-2007 21:26 ]

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


  • roy-t
  • Registratie: Oktober 2004
  • Laatst online: 17-10 16:43
Oeff.. ik had toch gehoopt op een iets logischere-simpelere aanpak dan stukjes geheugen heen en weer kopiëren. Het leek me een logische functie opzich.. Padschild, Pjonk en ROBIII ik wil jullie alvast hardstikke bedanken voor het zoekwerk van jullie, maar ik geef nog niet op.

Misschien is het even handig om uit te leggen waarom ik dan wel niet die code zo wil hebben.

Ik werk met een soort visualbasic database die via ftp overal te berijken moet zijn (ik heb hier een paar eerdere topics over gemaakt over kleine fundamentele dingen waar ik niet uitkwam, en kwam er toch uit dat VB6 beter geschikt was dan VWD.net en VB.Net door mijn kennis van 6 (en gebrek aan kennis van de VB.net) en dat ik geen betrouwbare .NET server kan draaien bij die computer.

Het probleem met een database via FTP is natuurlijk dat je kans hebt op verlies van data doordat mensen een bestand later openen (downloaden) en eerder weer sluiten (uploaden) dan jij zelf, waardoor jij bestanden overschrijft. Zonder te zien welke data een ander heeft ingevuld.

Hiervoor heb ik een stuk code geschreven, wat heel simplistisch gezegt het volgende doet voordat er weer ge-upload wordt:

download de database weer -> controle op wijzigingen in het record terwijl je bezig was -> laat die wijzigingen zien en vraag om actie (overschrijven?) -> upload het bestand met het gewijzigd record ingevoegd.

Ik weet dat de methode niet perfect is, maar een compromis.

Ik heb dit allemaal in modules en Public Sub's kunnen schrijven zodat ik voor zowel personeel als vestigingen, als elke andere tabel (een bestand in het ftp) die code niet hoef te herschrijven. Maar voor de code om te laten zien wat er overschreven moet worden moet ik het record van het bestand laten zien (je wilt immers weten wat je overschrijft) deze data hoeft niet meer bewerkt te worden. Ik wil dit ook met 1 universele code doen, door gewoon aan de sub die dit afhandelt 2 gedeclareerde instanties door te sturen naar die sub (2 records dus) dit zijn bijvoorbeeld tOld en tNew van het type OV_Personeel met 10 eigenschappen.

Het probleem is dat ik niet van te voren weet wat voor type ik stuur, het kan personeel zijn of vestigingen etc. (totaal zijn er zo'n 16) Het leek mij dus handig om hiervoor een loopje te schrijven om zo dit hele record in een tekstvak te gooien. De code zou dan altijd werken.

Dit is dus het probleem waar ik een oplossing voor probeer te vinden.

*therat10430 gaat nu maar snel wat users helpen met problemen met hun geluidskaart drivers zodat hij iig meer antwoorden geeft dan vragen stelt!

~ Mijn prog blog!


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Ik kan me inderdaad vaag nog wel wat heugen van je topics, en nu je je probleem zo even omschrijft daagt er wel weer wat. Maar ik kan daarop (helaas) maar 1 zinnige response geven: duuuuuuuuuude! :X
Geloof me, je bent voor wat je ermee wil bereiken, echt compleet het verkeerde pad ingeslagen. Dit soort dingen los je veel beter op met een centrale database, of desnoods een centrale service die die "bestanden" dan voor je wijzigt ofzo. Ik kan me (en dit bedoel ik absoluut niet lullig hoor) niet aan de indruk ontrekken dat je niet echt weet waar je mee bezig bent. Dat is geen probleem, zo zijn we immers allemaal ooit begonnen. Maar deze "ducttape en luciferhoutjes" oplossing gaat absoluut niet schalen, betrouwbaar werken of overweg kunnen met verschillende gelijktijdige gebruikers. Ik adviseer je toch om dit over te laten aan mensen die er meer kaas van hebben gegeten, danwel je eens wat meer te verdiepen in de vereiste stof die je voor dit onderwerp toch wel minimaal dient te beheersen.
Nogmaals, ik bedoel dit op de vriendelijkste manier waarop je dit kunt opvatten; zie het als goedbedoeld advies, maar dit gaat niet goedkomen ;)

Om toch nog even inhoudelijk te gaan; om jezelf een hoop werk te besparen kun je het best (zoals pjonk al aangaf) misschien nog wel het beste die types omzetten naar Classes; dat is nog niet eens zo heel veel werk als je gewoon wat vars public dimensioneert. Beetje quick'n'dirty maar veel meer dan wat copy/paste werk is het dan niet. Daarna is het een kwestie van elke class een ".ToString" method geven die de string-representatie van het object terug geeft en dan ben je al een heel eind; ook dat is maar eenmalig werk en prima te doen (ook al zijn het 30 classes). Helaas heeft VB6 (zo goed als?) geen reflection mogelijkheden en dus ben je aangewezen op dit soort constructies.

[ Voor 23% gewijzigd door RobIII op 02-01-2007 00:16 ]

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


  • roy-t
  • Registratie: Oktober 2004
  • Laatst online: 17-10 16:43
Dankje ROBIII, ik weet dat ik beetje met ducktape aan de gang bent, en ik weet dat er absoluut geen enkele kans is dat deze constructie goed werkt met 5+ gelijktijdige gebruikers.

Maar daar is deze database ook helemaal niet voor, het zal maximaal door 4 gebruikers tegelijkertijd gelezen worden (en dan heb ik het over de gehele database dus dat zijn zo'n 16files, en de secretaresse zit bijvoorbeeld alleen maar in de agenda, terwijl de directeur in personeel zit enzo)

en er is maximaal 1 iemand die bestanden gaat wijzigen, de secretaresse de agenda, de directeur personeelsbestands en vestigingen, en een andere werkneemster die het dagjournaal voor haar rekening neemt met nog wat andere dingen. De enige reden dat ik deze controle code wil schrijven is om in het geval dat ooit iemand ook een bestand wijzigt dat er een quick 'n dirty vangnet is.

De applicatie is eigenlijk ontwikkeld om offline te werken, gewoon een databaseje op 1 computer, dit kan natuurlijk perfect in VB6. Maar de baas wilde ook graag thuis wat kunnen doen, net als de pedagoge die thuis wel eens een dossiertje wilde invullen omdat ze het daar op het werk te druk voor heeft.

Je kunt deze 'database' dus het beste zien als een offline database met een nood-online oplossing.

Dan nu over je oplossing, is .ToString niet een vb.net code, of bedoel je dat ik zelf een soort to-string code maak :)

~ Mijn prog blog!


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
therat10430 schreef op dinsdag 02 januari 2007 @ 10:47:
of bedoel je dat ik zelf een soort to-string code maak :)
Dat dus ;)

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


  • roy-t
  • Registratie: Oktober 2004
  • Laatst online: 17-10 16:43
Ok, :) daar zal ik me eens mee gaan bezig houden, even afwegen wat meer werk is :) maar denk je dat ik toch een groot probleem heb met deze contructie? of denk je dat voor deze doeleinden de code wel kan?

(alle input wordt gewaardeerd, dus (juist) ook kritiek :) )

~ Mijn prog blog!


  • Lustucru
  • Registratie: Januari 2004
  • Niet online

Lustucru

26 03 2016

Die database van je, ligt daar een mdb gevalletje onder? DAN zou namelijk veruit de beste* manier zijn om gebruik te maken van de replica-mogelijkheden van jet. Krijg je alles in één keer kado: het vergelijken, weergave van wijzigingen en vragen om bevestiging van dubbelgewijzigde records.

En qua je oorspronkelijke vraag: je zou natuurlijk een simpele type-parser kunnen schrijven op de module tekst die de te maken code uitspuugt... :)


* op het ingeslagen pad tenminste

De oever waar we niet zijn noemen wij de overkant / Die wordt dan deze kant zodra we daar zijn aangeland


  • roy-t
  • Registratie: Oktober 2004
  • Laatst online: 17-10 16:43
@ Nielsje.. die database is eigenlijk gewoon een verzameling Bestanden die ik dus heen en weer breng via ftp, en die records bevatten op de vb manier (Put #1, recordnummer, type) dat is dus helaas niet het geval.

Maar wat bedoel je met een simpele type-parser? Hoe had je dat in gedachten

~ Mijn prog blog!

Pagina: 1