Printen uit Gambas: tekst, html of echt.

Eenvoudige tekst, html, of ingebouwd printen?

  1. Voor uitvoer kan je gemakkelijk een txt bestand maken vanuit gambas, dat je dan in eender welk programma kan openen en printen (bv Kate, …).
  2. Een andere mogelijkheid, waarmee je veel kanten uit kan is .html files maken vanuit gambas: die kunnen zowel bekeken worden met de browser, als van daaruit geprint. Als ze op een bereikbare plaats (gedeelde map of webserver) staan, zijn ze gemakkelijk te delen. (zie ook “html rapport weergeven of printen“)
  3. Je kan ook printen vanuit Gambas, dan moet je echt alles doen wat erbij komt; pagina beschrijven enz.

De online documentatie vermeldt onder Gambas versie 2.0 de uitleg van 3.0.

Gambas 2.21 bevat in ieder geval een “voorbeeld” toepassing: “Printing”, dat al bestaat sinds 2006.
Die bevat de componenten:

  • gb
  • gb.qt (bevat Draw, gebruikt voor sturen van grafische informatie naar het Printer object)
  • gb.qt.ext (bevat Printer)

Nota:
Deze componenten gaan niet samen met de algemene gb.gui component.
Wel kan je voor de gb.gtk en gb.gtk.ext kiezen, vermoedelijk verschaffen ze ongeveer dezelfde functionaliteit met licht anders uitzicht (KDE = Qt, Gnome = GTK).

In Gambas3 bestaat een Printer (gb.qt4) object.

Voor Gambas2: gebruik het “Printer” object, dat ondermeer volgende eigenschappen heeft:

  • Orientation (Portrait, Landscape)
  • Size “A4”
  • Copies (getal)
  • ColorMode (Black, Color)
  • Resolution (bv 600)

bv: Printer.Orientation=Printer.Landscape

Opbouwen van print in 4 stappen:

  1. Printer.Setup()
    Oproepen van print setup : geeft een standaard venster “Setup Printer” met de printerkeuze (als er meer printers zijn), en andere instellingen als “Printer Settings”, “opties”, papierformaatkeuze en aantal prints.
    Printer.Setup() geeft een waarde terug naargelang knop “OK” (FALSE) of “Cancel” (TRUE) gedrukt wordt.
    Aangezien “Cancel” TRUE geeft kan je een test doen met:

    IF NOT Printer.Setup()
    '  print commands
    ELSE
    '  Message.Error("print setup canceled")
    ENDIF
    

    Het aanroepen van Printer.Setup() is niet verplicht, maar wel nuttig voor de gebruiker.

  2. *1)
    Draw.Begin(Printer)

    vanaf hier begint het printen
     
  3. Draw.Text((“Voorbeeldtekst”), iStartX, iStartY)
    Draw.Rect(iStartX, iStartY, iBreedte, iHoogte)

    Zet tekst of teken vormen, bv: Teken een rechthoek op locatie … met afmetingen …

    Draw.Rect(800, 800, 80, 40) ‘ zet bovenaan links een klein rechthoekje op papier.
    Hoewel 800, 800 doet vermoeden dat het evenver van de boven als van de zijkant staat is dat niet het geval!

  4. Draw.End
    *2)

    Tot hier loopt het printen;

* Opmerking: “Application.Busy”

  1. INC Application.Busy
    wordt door de voorbeeldprogramma’s verhoogd net voor Draw.Begin
  2. DEC Application.Busy
    Application.Busy wordt door de voorbeeldprogramma’s verlaagd net na Draw.End
  3. Tekst wordt geprint op plaats x, y met:
    Draw.Text(“Deze tekst wordt afgedrukt”, x, y)

    Een paar andere eigenschappen kunnen ingesteld worden met/als:

          Printer.Orientation = Printer.Landscape
          Printer.Size = "A4"
          Draw.Font.Size = 18
          Draw.Font.Name = "Arial"
          Draw.Font.Underline = TRUE
          Draw.Font.Bold = TRUE
    

    en dat kan voor het aanroepen van Printer.Setup() gebeuren; je zal de instelling daar weergegeven zien, bv als je Printer.Landscape hebt ingesteld en nadien Printer.Setup() aanroept, staat “Paper Format” op “Landscape” in de drop-down box in het “Setup Printer” venster.

    Waarschijnlijk wil je een aantal (public of private) variabelen declareren, als:

    ' Gambas module file
    PUBLIC iFirstColStart AS Integer = 120
    PUBLIC iSecondColStart AS Integer = 2000
    PUBLIC iThirdColStart AS Integer = 5500
    PUBLIC iCurRow AS Integer = 800
    '
    PUBLIC iRepeatColStart AS Integer = iSecondColStart
    PUBLIC iDimensionColStart AS Integer = 3000
    PUBLIC iColorColStart AS Integer = 3500
    PUBLIC iNumberColStart AS Integer = 4000
    PUBLIC iDeliveredColStart AS Integer = 4500
    '
    PUBLIC iFontSizeMainData AS Integer = 28
    PUBLIC iFontSizeMidData AS Integer = 24
    PUBLIC iFontSizeDataTitle AS Integer = 14
    PUBLIC iFontSizeSmallData AS Integer = 10
    PUBLIC iFontTinyData AS Integer = 7
    PUBLIC sFontMainData AS String = "Arial"
    '
    PUBLIC fborder AS Float
    PUBLIC fTextHeight AS Float
    PUBLIC fTop AS Float
    

    Om te vermijden dat teksten door elkaar lopen in de print kan je de data wat inkorten, eventueel proefondervindelijk, bv:

    PUBLIC iMaxCusLen AS Integer = 12
    PUBLIC iMaxOrdNameLen AS Integer = 20
    

    Hier een stukje code waarin dat gebruikt wordt:

      IF NOT Printer.Setup()
      
          ' some printer settings
          Printer.Size = "A4"
          Printer.Orientation = Printer.Landscape
          ' why this?
          INC Application.Busy
           ' Draw printer page
          Draw.Begin(Printer)
          
          border = Printer.Resolution
    
          Draw.Rect(100, 100, 10, 10) ' just to fix the corner
          
          ' Draw.Ellipse(3000, 3000, 1200, 190)
          
          iCurRow = 300
          
          Draw.Text("Klant", iFirstColStart, iCurRow)
          Draw.Text("Ordernaam", iSecondColStart, iCurRow)
          Draw.Text("Ordernr", iThirdColStart, iCurRow)
          
          iCurRow = 500
    
    '      Draw.Rect(iFirstColStart, iCurRow, 2200, 300)
          
          Draw.Font.Size = iFontSizeMainData
          Draw.Font.Name = sFontMainData
          Draw.Font.Bold = TRUE
                
          
          Draw.Text(thisOrder.ShortCusName(iMaxCusLen), iFirstColStart, iCurRow, 1200)
          
          Draw.Text(thisOrder.ShortOrdName(iMaxOrdNameLen), iSecondColStart, iCurRow)
          
          Draw.Rect(iThirdColStart - 100, iCurRow, 1200 - 100, 280)
          Draw.Text(thisOrder.sOrdCode, iThirdColStart, iCurRow)
    
    ' ... enz.
    
          Draw.End
          
          DEC Application.Busy
      ELSE 
        Message.Error("Printing was canceled")
      ENDIF 
    

    Meer pagina’s printen?

    PUBLIC SUB GoNextPage()
      Printer.NewPage()
      INC iPageNumber
      iCurRow = iRowStart
    END
    

Versie van Gambas vanuit programma opvragen

De versie van je eigen programma kan je in een tekstvariabele steken met:

sMijnVersie = Application.version

Maar als je daarnaast de versie van Gambas zelf nodig hebt?
Binnen Gambas is er geen commando om dat op te vragen.

In de IDE is die natuurlijk zichtbaar in het menu: ? , About Gambas (bv: 2.21).

Maar als je de gambas versie wil weergeven vanuit je draaiende gambas programma?

Meestal zal je dan de runtime bedoelen; die heet gbx (van gambas execute). In gambas 2 is dat gbx2, in gambas 3 vermoedelijk gbx3.

In je besturingssysteem kan je meestal de versie van een programma opvragen met
programmanaam --version
Wat ook geldt voor Gambas:

gbx2 –version
2.21.0

gba2 –version
2.21.0

gbc2 –version
2.21.0

gbi2 –version
2.21.0

gbr2 –version
ERROR: #35: Cannot open file ‘–version’: No such file or directory

Zie ook: archiver, compiler, informer.

Linux command prompt is bruikbaar vanuit Gambas:

EXEC ["gbx2", "--version"] TO sRuntimeVersie

Fout bij starten: FMain.?.0 – starten vanuit MMain

Een applicatie die op zich wel werkt, start “soms” niet op, maar geeft volgende foutmelding:

Error at program start

Fout bij start FMain

This application has raised an unexpected
error and must abort.

[13] Null object.
FMain.?.0

Na enige tijd wordt duidelijk dat ik ze wel kan draaien vanuit de IDE, waar ik dus het project open en “run” kies.
Op een ander toestel waar de applicatie gecompileerd is en gestart wordt van een icoon op de desktop, treedt de bewuste fout steeds op. Het is nochtans identiek dezelfde source, met misschien een miniem verschil in versies Linux/Kde/Gambas IDE.

Als ik het fenomeen terugzie bij een andere applicatie lijkt er een verband te zijn: programma’s die ik start vanuit de gewone, standaard voorezien FMain werken wel na compilatie. De applicatie die ik laat opstarten vanuit een module “MMain” geeft de foutmelding – niet vanuit de IDE dus, maar wel als gecompileerde versie die gestart wordt met een klik op het icoon naar de “programmanaam.gambas” file.

Gambas FMain MMain

Gambas FMain MMain


In MMain worden een aantal initialisaties gedaan, alsook de taal-check. Deze laatste zorgt ervoor dat vanaf het eerste “scherm” (of de eerste Form) de gelezen voorkeur-taalinstelling aktief is. MMain eindigt met de oproep van FMain, van waaruit dan verder gewerkt wordt.

De oorzaak blijkt een bug te zijn: in de MMain code wordt FMain fout aangeroepen:
FMain.Show in plaats van FMain.Show(). De IDE lijkt daar niet over te struikelen, maar -eens gecompileerd- de runtime dus wel.

upd 22/03/2012: Ik ben niet helemaal zeker van deze analyse, ik meen toch nog een ander voorbeeld te zijn tegengekomen waar de Show() correct was. Misschien is het een “combinatie van problemen” ?

Update:
Een interessant verschil blijkt te zitten in het behouden van de debug informatie bij het compileren. Als dat “aan” staat crasht de applicatie niet als je ze start vanop de link op de desktop!
“Make executable”, “options”, “Keep debugging information in executable”.
(Oorzaak van de fout: zie “Don’t TRY to DEBUG“)

Gambas 2 en Gambas 3 op OpenSUSE 12.1

Gambas 2 uit gbvalor
Dit is een andere (*) installatie van Gambas 2 en 3 op openSUSE 12.1 en ze verliep vlekkeloos:
– openSUSE 12.1 van DVD geïnstalleerd.
– software bijgeïnstalleerd: lamp server enz.
– community repositories laten scannen, en .
– repository bijgeïnstalleerd: Google zoek op “gbvalor”, waarvan ik weet dat het de gambas repository is die ik meestal gebruik.
– in Yast, repositories, nieuwe, geef URL, de URL ingeplakt; die wordt gecheckt en aanvaard.
– software management, zoek “gambas”; de hele reeks gambas componenten is beschikbaar.
– Kies Gambas2 IDE, bevestig alles.
– Daarna is het menu-item “Development” bijgekomen (in de “classic” menu-style), met daarin Gambas2; start perfect.
– Nadien wordt het pakket vermeld als behorende tot “Development/Tools/IDE” en als leverancier “openSUSE-Education”.

Als je view op Repositories zet, vind je zowel Gambas 2 als 3 terug onder openSUSE BuildService – Education.

Hetzelfde voor Gambas3:
– Yast, software management, zoek “Gambas”
– Selecteer “Gambas 3 IDE”, bevestig.
– Gambas 3 is daarna opgenomen in het menu onder “Developement”, en start perfect.
– Nadien bij “Package Group: Development/Tools/IDE”, vendor “openSUSE-Education”

Bij Software, view “Pattern” is gambas3 IDE terug te vinden onder “Youth Education Desktop software”, gambas2 vind ik niet terug.

(*)
Op een eerdere openSUSE 12.1 installatie kreeg ik Gambas3 oorspronkelijk niet vlot geïnstalleerd, maar dat was misschien niet representatief…

Valse echo eet letter op bij invoer en weergave

Ik had een vervelende fenomeen van een soort “echo” op mijn scherm in een textbox, die ik wilde vullen met de invoer van een andere textbox.

De invoer gebeurde in txbxEditField.

Het was de bedoeling dat als de tekst daar klaar was, en de gebruiker enter of return drukt, de tekst ingevuld wordt in een cel in een tabel “tbvwDoel”. Het invullen in die tabel gebeurde met de functie valToTable() die in essentie niet meer doet dan:

tbvwDoel[iRowSelected, iColNewValue].Text = txbxEditField.Text

Ik ving bij het invoeren de Enter en de Return knop op om de invoer te aanvaarden:


PUBLIC SUB txbxEditField_KeyPress()
IF Key.Enter
valToTable()
btEditOk_Click()
ENDIF
IF Key.Return
valToTable()
btEditOk_Click()
ENDIF
END

Maar het vervelende effect was dat in de tabel de tekst die ingetikt wordt zichbaar is maar telkens met 1 letter vertraging, met 1 letter minder dan wat ingegeven is. Dat is bijzonder irrittant voor de gebruiker, die eigenlijk kijkt naar de plaats in de tabel in plaats van naar het invulveld.

Het is een kleine “logische” fout:


PUBLIC SUB txbxEditField_KeyPress()
IF Key.Code = Key.Enter
valToTable()
btEditOk_Click()
ENDIF
IF Key.Code = Key.Return
valToTable()
btEditOk_Click()
ENDIF
END

Nu gebeurt wat de bedoeling is. Het andere, verkeerde effect is leuk om te onthouden …

Gambas 3 (en 2) zoeken voor OpenSUSE 12.1

Vooraf: Installeer openSUSE 12.1, bv van een CD/DVD waarvan je de inhoud kan afhalen van http://software.opensuse.org/121/en ( Algemeen: http://www.opensuse.org/ )

Gambas 3
Daarna zoek je Gambas voor openSUSE:
http://en.opensuse.org/Gambas; in de rechtse kolom heb je “Download for openSUSE:” en de links naar 12.1, 11.4 en 11.3 (op moment van dit schrijven).

opensuse install gambas
Je komt op een soort Package Search, waar je kan kiezen uit Gambas 2 en 3 voor verschillende versies van openSUSE.

  • Versie 3 is net uit: “3.0.0.3”

Bovenaan de lijst met software staat meestal het algemene pakket – de interpreter- (zoek programmeeromgeving of “IDE”, met alles erbij of installeer dat later), eronder de afzonderlijke modules, om enkel te installeren wat je nodig hebt.

Rechts staat de “repository” waar het uitkomt; bv “Education/oepnSUSE_12.1”.

Net daaronder een “1 Click install” link.

Net daaronder krijg je een gedetailleerde tabel met (link naar) i586-, src- (source) en x86_64- (64 bit) versies.

Een klik op “1 Click install” link en Firefox biedt aan om gambas3.ymp te openen met “Yast 1-Click Install”. (ok)

Er worden automatisch een paar repositories (perl, python, Education, non-oss..) toegevoegd. (bevestig: next).

Select the software components you wish to install: [v] gambas3
Alles staat klaar, dus bevestig (next) en bevestig nog eens het overzicht.

Geef het root wacthwoord om te mogen installeren. Ik bevestigde de key van Perl en van python (trust).

Sluit af na:

Software installation
Installation was successful. (Finish)

Gambas IDE

Meestal staat na installatie Gambas bij in je menu; ik merk hier in het “traditionele” KDE-menu dat er geen rubriek (programmeren of Educational of zo) is bijgekomen. Evenmin zie ik het verwachte “laatst geïnstalleerd” menu-item. Nee, opnieuw inloggen voegt het niet toe.
De gambas die ik gekozen had was dus de basis Gambas Basic interpreter, niet de volledige IDE (= Integrated Development Environment; programmeeromgeving).

Gelukkig zijn nu wel de juiste repositories aanwezig en is het maar kwestie van de IDE te gaan kiezen in het softwarebeheer:
– Menu, Yast, install/remove software.
– Zoek “gambas”.
– Kies uit de lijst de IDE (automatisch worden een aantal andere mee geselecteerd), en al wat je nog denkt nodig te hebben.
– Bevestig (Accept), bekijk “Automatic changes”, ga verder (continue).

Je ziet dat er nu iets meer gedownload wordt; dat duurt even en je ziet alles voorbijrollen tot het klaar is.

Nu krijg je in het menu wel een “Recently Installed” keuze, met daarin
Gambas3 (Basic Development Environment 3)
Er is ook een menu “Development” bijgekomen (als je dat nog niet had), met daarin dezelfde keuze om Gambas te starten.

Update:
Direct na installatie: Oops!! Gambas3 start niet uit het menu!
Na een hele reeks updates (op 5/3/2012) waarin ik heel wat “Gambas” bestanden zag voorbijrollen op het scherm, start Gambas 3 perfect op, en het eerste beste voorbeeldprogramma dat erbij zat kon geopende worden in de IDE en gecompileerd/gestart worden.

Gambas 2

Optie: installeer daarnaast tevens Gambas2, ook via Yast, Software Management.

  • Versie 2-2.23 is de (laatste?) stabiele versie van de 2.x tak (voor KDE3), terwijl de huidige distributies aan KDE4 toe zijn. (Bv mijn laatste installatie op openSUSE 11.3 was versie 2-2.21)

Nota: Daar haal je wel een hoop KDE3 mee binnen!
De installatie verloopt vlot (repositories zijn al voorzien, dus enkel kiezen uit de software).
Er komt een menu-item bij onder Development-Integrated Environment: Gambas2…
Gambas 2 start op met het bekende scherm, voorzien van voorbeeldprogramma’s.

Nota:
Later, op een andere installatie gebruikte ik een andere weg: Gambas 2 en Gambas 3 op OpenSUSE 12.1

Veel programmeer-plezier!

Error management – foutbeheer

Bij gebruik van een databank lijkt de eenvoudigste manier om de fouten op te slaan in de databank; tenzij de fouten juist gaan over de databankverbinding.

Een alternatief is ze op te slaan naar een tekstbestand “error.log”, zoals de meeste programma’s. Het is bedrijfszekerder en de fouten zijn gemakkelijk te raadplegen zonder dat de applicatie draait, of zonder zelfs de databank draait.

Wat moet er in de foutlijn in de logfile staan? Minstens:
Foutmelding, datum, tijd, systeeminformatie als user@host

Een paar voorbeelden uit /var/log:

Zypper:mail
2010-07-27 11:32:25 <1> mybox(17593) [zypp] RpmDb.cc(~RpmDb):310 ~RpmDb()
2010-07-27 11:32:25 <1> mybox(17593) [zypp] RpmDb.cc(closeDatabase):805 closeDatabase: RpmDb[NO_INIT]
2010-07-27 11:32:25 <1> mybox(17593) [zypp] TargetImpl.cc(~TargetImpl):302 Targets closed

X.org:
(II) intel(0): Output VGA is connected to pipe A
(II) intel(0): [drm] dma control initialized, using IRQ 16
(II) Mouse[1]: ps2EnableDataReporting: succeeded
(II) AIGLX: Suspending AIGLX clients for VT switch
(II) intel(0): xf86UnbindGARTMemory: unbind key 0

mail.err
Aug 25 10:24:01 linux postfix/postfix-script[3310]: fatal: the Postfix mail system is not running

Moeten er alleen fouten in staan, of ook meldingen van bv een toestand? Dan wordt het meer een soort “message log”. Cups lijkt letters te gebruiken als I = info, E = Error, W = warning:

/var/log/cups/error_log

I [25/Aug/2010:15:15:49 +0200] Started “/usr/lib/cups/cgi-bin/admin.cgi” (pid=1119)
E [25/Aug/2010:15:15:49 +0200] CUPS-Add-Modify-Printer: Unauthorized
W [10/Sep/2010:15:19:40 +0200] [Job 1886] Unknown choice “Auto” for option “InputSlot”!

Of moet je het scheiden zoals bij “mail“, in verschillende bestanden:

mail
mail.err
mail.info
mail.warn

Kan bv de “debug” omgeleid worden naar een bestand? Dan heb je de debug meldingen bij het programmeren+draaien van de code, en vergelijkbare data in de log.

Log snoeien: hoe lang mag log worden? FIFO die oudste data verliest, of telkens bij nieuwe start de vorige log leegmaken?

Afgeleide klasse van Listbox, vanuit code het object maken/instantiëren en gebruiken in een VBox

Doel: weergave van de dagen van de week, waarbij iedere dag een reeks waarden bevat (orders). De dagen van een week zijn vertikaal gegroepeerd.

De dag wordt voorgesteld als een soort listbox, met op iedere lijn de weergave van een ordernummer. Maar ik wil niet alle Dag-Listboxen, met steeds dezelfde eigenschappen, op het scherm tekenen.

De orders worden er naartoe “gesleept” (vierkantje op schermafbeelding) en komen in de lijst als je ze loslaat boven de dag (maandag op schermafbeelding).

Als er meer orders in de listbox komen, moet hij “groeien”, dwz de hoogte van de listbox moet groter worden; en omgekeerd moet hij ook kunnen krimpen.

Bovendien: de Dag-Listbox moet meer kunnen dan een listbox, ik maak dus een afgeleide klasse bv myListbox, of zo. Beter: ik noemt die CPlanDay; het geeft de planning voor die dag weer.

VBox ordent een aantal van mijn Listboxes (objecten van CPlanDay) vertikaal tot een week.

Volgende vragen bleven me open toen dat gelukt was:

  • Hoe maak ik een klasse die afgeleid is van een bestaande (Listbox)?
  • Hoe maak ik de objecten van die klasse vanuit code; “on the run”?
  • Hoe kan ik de extra mogelijkheden programmeren?
  • Hoe bereik ik de bestaande mogelijkheden van de ouder-klasse Listbox?

Eerste poging:
Continue reading

Gambas 1 + 2 + 3 op Fedora 16

Proficiat voor Fedora 16: Bij deze distributie is in het package management (install/remove software, zoekveld “gambas”) een uitgebreide keuze aanwezig:

  • Gambas 3 (2.99.5) 2.99.6 na een online update op 6/1/2012
  • Gambas 2 (2.23.1)
  • Gambas 1 (1.0.19)

Je kan zowel kiezen voor de individuele paketten als voor de hele programmeeromgeving als voor de runtime.

Bij installatie van de programmeeromgeving krijg ik nadien een foutmelding in verband met KDE.

Bij het opstarten blijken de “Examples” niet mee geïnstalleerd te zijn.

Ook de “Help Files” zijn niet automatisch geïnstalleerd, maar kunnen eenvoudig na-geïnstalleerd worden: klik op optie-box en “Apply”! Voor Gambas2 is dat gelukt, gambas 3 blijven de voorbeelden leeg maar ik weet niet of dat aan de pre-release versie ligt (2.9 ipv 3.0)

Gordijn: Een HSplit om twee GridViews te schalen zoals in een spreadsheet

Doel:
Het scherm is in twee verdeeld: links en rechts een rooster met gegevens, ongeveer er uitziend als een rekenblad/spreadsheet.

De gegevens aan de linkse kant wil je altijd zien omdat ze vaste titels en gegevens van de rij bevatten, bv de naam van een persoon (naam, voornaam, geb.datum, in dienst datum), waarvan in de volgende kolommen gegevens te zien zijn, bv aanwezigheden in een maand.

Van het linkse rooster is de eerste kolom meestal genoeg, de andere gegevens zijn “verborgen” achter de data van het rechtse rooster. Maar af en toe wil je toch de andere gegevens raadplegen, bv even naar de geboortedatum kijken, en wil je het rooster wat breder maken. Het lijkt alsof je een gordijn opzijschuift.

Er zijn meer kolommen met gegevens dan het scherm breed is, dus het rechtse rooster kan horizontaal scrollen. Er zijn ook meer rijen dan het scherm kan weergeven, dus beide roosters scrollen ook vertikaal.

Je hebt dus twee gridviews nodig: GridView1 links en GridView2 rechts.
Met de HSplit kan je horizontaal een “schuiver” krijgen om twee elementen met een middengrip groter/kleiner te maken, horizontaal in dit geval. Maar om dat te kunnen is er een “hoger” element nodig, dat de twee gridviews omvat, en van waaruit de Split kan werken, hier een HBox.

Gebruik van HSplit met GridViews

In de IDE rechts bij eigenschappen (properties), tabblad “hierarchy” krijg je dan deze structuur (zie afbeelding).

Het vervelende is dat de twee grids hun eigen scrolbars hebben, en niet alleen horizontaal maar ook vertikaal afzonderlijk scrollen. Dan klopt de horizontale lijn van de gegevens niet meer.

Daar kan je wel manueel en mouw aan passen; bv het weergeven van log gegevens, linkse grid de titel of naam van een logitem, rechtse grid de gegevens of data die gelogd en weergegeven worden.

Als je in het linkse “names” grid naar beneden scrolt moet het rechtse data-grid meescrollen:

PUBLIC SUB grvwLogNames_Scroll()

  grvwLogData.ScrollY = grvwLogNames.ScrollY

END

En omgekeeerd ook natuurlijk; als je in de data scrolt moeten de namen meescrollen:

PUBLIC SUB grvwLogData_Scroll()

  grvwLogDataNames.ScrollY = grvwLogData.ScrollY

END

Bovendien is het handig dat een klik op het rechtse grid ook “werkt”, dwz eigenlijk hetzelfde doet als een klik op het linkse grid.

PUBLIC SUB grvwLogData_Click()

  grvwLogNames.Row = grvwLogData.Row
  grvwLogNames_Click

END