[Delphi] Access editbox lezen/schrijven via API

Pagina: 1
Acties:

  • OZ-Gump
  • Registratie: November 2002
  • Laatst online: 25-08 14:38

OZ-Gump

terug van weggeweest

Topicstarter
Mensen,

via google-groups en MSDN kom ik er niet uit: ik wil een editbox op een AccessForm uitlezen via API en daarna (eventueel) een andere waarde via API plaatsen. Via Spy++ en WinSight is de handle van die edit echter niet te achterhalen. Ik heb het ook met GetActiveWindow geprobeerd, maar die retourneert de popup waar de edit op staat.
Heeft iemand van jullie een idee? Ik krijg die *&%*%# handle niet te pakken van 't ding! |:(

T.I.A.

My personal website


  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Kan je er niet gewoon bij via OLE Automation?
http://www.djpate.freeserve.co.uk/Automation.htm

We adore chaos because we like to restore order - M.C. Escher


  • OZ-Gump
  • Registratie: November 2002
  • Laatst online: 25-08 14:38

OZ-Gump

terug van weggeweest

Topicstarter
Nou... het is een eeh.... nou.... eh... niet echt een database van mij zelf. Het is meer een eh... zeg maar ..... een .MDE .
Dus ik weet het naam van de editbox ook niet. Vandaar. Ik zou Access dus best via OLE kunnen openen met het juiste bestand, maar volgens mij zit ik dan met hetzelfde probleem....
Ik ga nu in ieder geval kijken of ik op die manier alle controls kan doorlopen tot ik de juiste heb. Ik houd je op de hoogte...

My personal website


  • _Thanatos_
  • Registratie: Januari 2001
  • Laatst online: 22-06 10:32

_Thanatos_

Ja, en kaal

Je wilt de data uit de Access database in delphi inlezen? Dat kan gewoon via ODBC...
Anders snap ik ook niet wat je nou wilt...

日本!🎌


  • OZ-Gump
  • Registratie: November 2002
  • Laatst online: 25-08 14:38

OZ-Gump

terug van weggeweest

Topicstarter
OK, laat ik het dan wat duidelijker maken: ik heb een Access-mde waar via een scherm een bepaalde code moet worden ingegeven. En dat kunnen nogal wat verschillende codes zijn. En die wil ik natuurlijk niet allemaal met de hand ingeven. Vandaar dat ik een bestaand form wil openen en de code wil ingeven, kijken of er een melding komt dat 'ie fout is en zo ja, de volgende code proberen. Ik wil dus niks in een tabel zetten of uit een tabel lezen, maar een code in een scherm proberen in te geven, kijken of die goed is en zo niet de volgende proberen.

Via OLE kom ik een heel eind, maar ik kan de namen van de controls niet gedisplayed krijgen. Ik heb een Controlcount van 65, maar kan de namen niet tevoorschijn toveren. (controls[i] geeft een IDispatch(?) terug) Van de components van het form wel, maar die heeft weer geen count (geen componenten op het form?).
Oftewel: met OLE ben ik al een stukje dichterbij, maar ik ben er nog niet... Werkt wel leuk, dat OLE.

My personal website


  • _Thanatos_
  • Registratie: Januari 2001
  • Laatst online: 22-06 10:32

_Thanatos_

Ja, en kaal

Pak anders MSDN Library erbij, daar staat de volledige reference van OLE met Access.

日本!🎌


  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

OZ-Gump schreef op 26 November 2002 @ 08:53:
Via OLE kom ik een heel eind, maar ik kan de namen van de controls niet gedisplayed krijgen. Ik heb een Controlcount van 65, maar kan de namen niet tevoorschijn toveren. (controls[i] geeft een IDispatch(?) terug)
IDispatch is 1 van de basis interfaces van OLE Automation.

Er wordt IDispatch teruggegeven omdat er verschillende controls op een form zitten die niet allemaal dezelfde properties hebben. Een edit veld heeft hele andere eigenschappen als een combobox. Nu kan je mbv QueryInterface achterhalen welke interfaces ondersteund worden door elk component en zorgt dat je de juiste krijgt. Of je gebruikt late binding en stopt dat IDispatch resultaat in een Variant. Het is waarschijlijnk nodig dat je je even verdiept in COM in het algemeen en OLE Automation in het bijzonder.

We adore chaos because we like to restore order - M.C. Escher


  • OZ-Gump
  • Registratie: November 2002
  • Laatst online: 25-08 14:38

OZ-Gump

terug van weggeweest

Topicstarter
LordLarry: daar lijkt het inderdaad wel op. Voorheen werkte ik op een iets andere manier, maar dit lijkt me ook erg interessant. Ik zal me eens wat dieper in OLE Automation gaan verdiepen en kijken of ik het dan voor elkaar krijg. In ieder geval hartelijk dank voor de reacties!

My personal website


  • OZ-Gump
  • Registratie: November 2002
  • Laatst online: 25-08 14:38

OZ-Gump

terug van weggeweest

Topicstarter
Nou.... ik ben er hoor... Via OLE automation kan ik inderdaad de controls doorlopen en de tekst ervan weergeven en aanpassen. Heb ik nog een klein vraagje (sorry, blijf vervelend ;) ).
Doordat ik de focus van het eerder genoemde editboxje haal, krijg ik dus de melding dat het niet goed is. Nou wil ik graag die melding ook afvangen in code. Met FindWindow en FindWindowEx kom ik er niet, want als ik dan een break zet op de SendMessage in onderstaande code
code:
1
2
3
4
5
If IsWindow(h1) then
  begin
    SendMessage(met een klikje);
    Exit;
  end;

komt 'ie gewoon nooit bij die Break! Het lijkt erop dat die MessageBox van Access op Modal staat voor het complete systeem: pas als die box weg is gaat mijn code (in een compleet andere app dus!) verder. Heeft iemand van jullie nog een idee hoe ik die melding weg kan krijgen?
T.I.A.

My personal website


  • OZ-Gump
  • Registratie: November 2002
  • Laatst online: 25-08 14:38

OZ-Gump

terug van weggeweest

Topicstarter
Voor de volledigheid blijf ik de voortgang posten, in de hoop dat iemand dat laatste zetje in de juiste richting kan geven... ;)
Ik heb nu twee apps gemaakt, waarvan er eentje (app2) elke 250 msecs controleert op de MessageBox, zodat ik daarbij niet afhankelijk ben van het feit dat die message van een automation object komt (en dus de code in app1 stopt met uitvoeren). Ook dan kan de messagebox niet gevonden worden. Met Spy++ heb ik alle windows (parent en child) nagekeken, maar het lijkt niet te lukken, hij vind hem niet.
Mochten jullie code nodig hebben, dan hoor ik het wel....

My personal website

Pagina: 1