[Delphi] Datagrid selecteert invoer direct *

Pagina: 1
Acties:

  • Tyf
  • Registratie: December 2002
  • Laatst online: 28-11-2025
Ik zit met een zeer lastig maar dom probleempje.
Namelijk als ik iets typ in een datagrid (en onkeypress wegschrijf naar de bijhorende clientdataset) gaat de datagrid altijd de ingetypte tekst selecteren met gevolg als je het volgende cijfer van je getal wilt typen deze de vorige overschrijft.
Klinkt waarschijnlijk raar maar een foto zegt meer dan 1000 woorden dus heb ik er ook ff paar screens van gemaakt.

Wat gebeurd:
Ik kies een rij uit. Zet cursor achter de 0 en wil 32 intypen.
Afbeeldingslocatie: http://usera.imagecave.com/Tyf/eerste.JPG

Ik tik de 2 in en onmiddelijk word gans de tekst blauw geselecteerd
Afbeeldingslocatie: http://usera.imagecave.com/Tyf/tweede.JPG

ik wil de 3 intikken en doordat de huidige tekst geselecteerd is word deze nu overschreven met 3
Afbeeldingslocatie: http://usera.imagecave.com/Tyf/derde.JPG

je zou nu manueel met de muis (niet met pijltjes want door keypress event wordt alles toch weer geselecteerd) cursor goed kunnen zetten en selectie ongedaan maken. Maar dit is gewoon geen werk.

Huidige oplossing waar ik vanaf wil is een soort delay waardoor er halve seconde gewacht wordt voor er weggeschreven wordt naar de datasetclient enzo kun je meerdere cijfers intikken zonder dat de huidige tekst geselecteerd wordt.

Ik heb al zitten rondkijken maar ik zou echt niet weten hoe je dit opgelost krijgt. Redelijk irritant probleem die de gebruikersvriendelijkheid van het programma niet ten goede komt.

  • DoubleTweak
  • Registratie: September 2001
  • Laatst online: 11:50
Waarom gebruik je een onkeypress en geen onchange? Onkeypress gaat af bij elke toetsaanslag en onchange wanneer de focus van de kolom afgaat en de inhoud gewijzigd is.

Be like a duck. Calm on the surface, but always paddling like the dickens underneath.


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 07-05 22:49

curry684

left part of the evil twins

Titel even duidelijker gemaakt, met "Irritant probleem" kunnen we natuurlijk geen bal. Zie ook de sticky met de extreem onopvallende titel *** Over topictitels in P&W - lezen voor topic openen!!! *** ;)

edit:
Oh my... spelfout nu ook eruit :X

[ Voor 9% gewijzigd door curry684 op 22-04-2005 11:32 ]

Professionele website nodig?


  • FendtVario
  • Registratie: Januari 2002
  • Laatst online: 12-05-2025

FendtVario

The leader drives Vario!

Als je de waarde wijzigt en dan op enter drukt of naar een andere cel beweegt zorgt er ook voor dat de waarde naar de dataset geschreven wordt. Daar heb je geen onkeypress voor nodig.

[ Voor 13% gewijzigd door FendtVario op 22-04-2005 11:28 ]

www.fendt.com | Nikon D7100 | PS5


  • Tyf
  • Registratie: December 2002
  • Laatst online: 28-11-2025
Excusses voor de slechte titel.

@DoubleTweak
Wel de berekeningen die moeten gebeuren doe ik het liefst bij elke aanslag van een toets.
In het geval dat dit echt niet gaat kan ik met wa aanpassingen de onchange wel gebruiken.
Alvast bedankt voor de tip.
Edit: onchange staat niet bij de acties van mijn dbgrid??

@FendtVario
Ook hier weer het liefst had ik de berekeningen gedaan bij elke aanslag.
Waarom omdat ik dan via selectedfield.... van de dbgrid bepaalde waarden controleer, bereken en indien nodig weer reset(bij foute invoer). Ik weet nu niet als ik met mijn muis ofzo van cell verander de selectedfield dan nog wel werkt. En een simpelere oplossing om de juiste waarden op te vragen en aanpassen ken ik niet.
Ben totaal geen delphi specialist :(

[ Voor 54% gewijzigd door Tyf op 22-04-2005 11:35 ]


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 07-05 22:49

curry684

left part of the evil twins

Tyf schreef op vrijdag 22 april 2005 @ 11:28:
Wel de berekeningen die moeten gebeuren doe ik het liefst bij elke aanslag van een toets.
In het geval dat dit echt niet gaat kan ik met wa aanpassingen de onchange wel gebruiken.
Waarom bij iedere aanslag? Dan loop je merendeel van de tijd foute data te berekenen. Stel je voert de prijs 124.63 in bij een produkt. Dan doe je dus in jouw aanpak eerst 3 keer compleet nutteloze berekeningen op basis van 1, 12 en 124, vervolgens krijg je een knaller op "124." omdat het geen geldig getal is, en daarna reken je nog een keer fout met 124.6 voordat je eindelijk een bruikbaar resultaat berekent. What's the bloody use van continu herberekenen ipv wachten tot de gebruiker de correcte invoer bevestigd heeft :)

Professionele website nodig?


  • Tyf
  • Registratie: December 2002
  • Laatst online: 28-11-2025
De reden was omdat de gebruikers dit gewoon waren van het oude programma en omdat dit voor mij het makkelijker maakte om bepaalde zaken technisch op te lossen.
De berekeningen zijn echt nie zwaar (paar optellingen en aftrekkingen) dus tis niet dat het echt de pc belast.

  • DoubleTweak
  • Registratie: September 2001
  • Laatst online: 11:50
Je kunt het Field OnChange event gebruiken of de OnCelExit van de DBGrid.

Onkeypress vanwege die berekeningen lijkt me een erg slecht plan.

Be like a duck. Calm on the surface, but always paddling like the dickens underneath.


  • ReallyStupidGuy
  • Registratie: Januari 2002
  • Laatst online: 01-05 10:31
onchange gebeurt in een TField (property van een dataset), als het grid een onchange event zou hebben zou je het zelfde probleem hebben omdat het event ook na elk toegevoegd karakter zou plaatsvinden.
Is het geen oplossing om de berekeningen uit te voeren op het moment dat er iets in de grid wordt aangepast en het bijwerken van de dataset pas als de invoer compleet is. En wat bedoel je eigenlijk met het bijwerken van de dataset? De grid geeft gewoon weer wat er in de dataset staat. Of bedoel je misschien een post van de dataset?

Over die selectie van de waarde: misschien heeft een TField een property waarmee je kunt bepalen of de text geselecteerd moet worden? Dan zou je die kunnen verranderen.
Of iets in het event dat je toch al gebruikt waardoor je de cursor op de juiste positie plaatst, dan heb je waarschijnlijk ook geen selectie meer. (maar ik denk zelf dat je de dingen beter anders kunt aanpakken, hoewel ik de delay oplossing ook wel erg creatief vindt.....)

Duizend wijzen kunnen meer vragen stellen dan één idioot kan beantwoorden.


  • Tyf
  • Registratie: December 2002
  • Laatst online: 28-11-2025
Ik zou misschien ook beter zeggen dat ik met delphi 7 werk
Ik heb dus in begin zaken zitten zoeken als oncelexit, onchange van mijn dbgrid maar deze staat hier dus echt niet in ??
Daarom ook dat ik dan heel andere aanpak gezocht heb om dit op te vangen.
OnColExit zit er bv in maar dit is totaal niet wat ik nodig heb

@ReallyStupidGuy (vind je echt niet stupid ;))
Je hebt me al een boel duidelijker gemaakt. Moet wel nog zoeken waar je die TField zijn props vind.
Momenteel worden de Kolommen gegeneerd in de code aan de hand van gegevens uit db.

[ Voor 28% gewijzigd door Tyf op 22-04-2005 11:51 ]


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 07-05 22:49

curry684

left part of the evil twins

Tyf schreef op vrijdag 22 april 2005 @ 11:47:
OnColExit zit er bv in maar dit is totaal niet wat ik nodig heb
Write an OnColExit event handler to take specific action when a cell is about to lose focus. For example, use OnColExit to post edits to the underlying dataset when the user leaves a cell, rather than waiting for the user to leave the record.
Huh? :?

Professionele website nodig?


  • Tyf
  • Registratie: December 2002
  • Laatst online: 28-11-2025
Curry toen ik dit test werkte het niet zoals daar beschreven hoor.
Nu dit was in mijn begin periode van delphi (nu al goeie maand en half verder) ik zal nog een keer proberen.

OnCollExit doet dus idd totaal niet wat ik wou.
Als ik met cursor naar volgende record ga (en de cell dus zijn focus verliest) gebeurd er niks.
Het is dus werkelijk on Collum exit en niet CellExit dat dit doet

[ Voor 39% gewijzigd door Tyf op 22-04-2005 12:12 ]


  • ReallyStupidGuy
  • Registratie: Januari 2002
  • Laatst online: 01-05 10:31
Ik ben nu bijna klaar met mn afstudeerprojectje in delphi (1 jaar zwoegen in mn uppie >:( ) en heb ook ontdekt dat niet alles werkt zoals je het aan de hand van de Delphi help (wel lekker uitgebreid) zou verwachten.

De TField propperty kun je vanuit het dataset bereiken door met de rechtermuisknop op het dataset te klikken en de fieldeditor te openen. (clientdataset weet ik niet..) Misschien staat het ook ergens bij de properties van de grid. Je moet zoeken naar iets van een AutoSelect property (designtime) of eventueel een sellength (runtime) om de selectie ongedaan te maken.

Duizend wijzen kunnen meer vragen stellen dan één idioot kan beantwoorden.


  • Tyf
  • Registratie: December 2002
  • Laatst online: 28-11-2025
@ReallyStupidGuy
Thx weer hele pak info erbij die ik kan gebruiken.
Ik heb nog enkele probleempjes om je oplossing te proberen. De dataset zijn fields worden in de code toegevoegd. Dus ik kan niet via de editor werken. Enig idee hoe je een event van een field in een dataset @runtime aanpast? Ik heb op internet al voorbeelden gevonden voor gewone objecten maar zie niet direct in hoe je dit zou kunnen doen op een field van een dataset.
vb van gewoon object voor mensen die dit eens willen zien:

[code]
with TButton.Create(self)do
begin
Parent:=Self;
Caption:='Exit';
--> OnClick:=MyButtonClick
end;
[code]

Mijn probeersel hiervan (werkt nu)

ClientDataSet.FieldByName('Bestelnr').OnChange := OnEditGridfield;

waarvan OnEditGridfield:
procedure TfrmProductieFicheBase.OnEditGridfield(Sender: TField);


Ik heb ook zitten zoeken naar een autoselect prop en sellength maar voorlopig nog geen tegen gekomen.


Ik heb het voor mekaar gekregen de prob in te stellen on datachange van het tfield in de datagrid.
Maar nu krijg ik hele rare dingen. Functies die vroeger perfect gingen gaan nu niet meer.
bv ik gaf de data door van de dataclientset via dataclientset.data, dit werkt nu niet meer ?
Man man ik haat programeren in een taal waar je niks van kent en dan nog nie de tijd krijgen om het deftig te leren. Mens mag direct hier programmeren gelijk hij het al van volledig kent.

[ Voor 58% gewijzigd door Tyf op 22-04-2005 15:54 ]


  • Tyf
  • Registratie: December 2002
  • Laatst online: 28-11-2025
ff uppen hij is al redelijk gedaald

  • ReallyStupidGuy
  • Registratie: Januari 2002
  • Laatst online: 01-05 10:31
Tyf schreef op vrijdag 22 april 2005 @ 16:40:
ff uppen hij is al redelijk gedaald
Heb jij even geluk dat er geen modje was die dat zag :P Kicken binnen 24u wordt hier niet echt gewaardeerd.

Over die autoselect property: die wist ik ook niet zeker maar ik dacht dat er misschien wel zoiets in zou zitten.

Wat er mis gaat met je onchange weet ik ook niet, ik weet niet eens wat je dan probeert uit te voeren..

Zou je niet iets van (uit mn hoofd)
code:
1
2
3
4
procedure TfrmProductieFicheBase.OnEditGridfield(Sender: TField);
begin
  Sender.cursorposition:=length(Sender.text);
end;


Niet helemaal netjes in de GUI als de gebruiker een getal wil aanpassen door er wat tussen te zetten maar blijkbaar heb je toch al een automatische autoselect :|

Lekker makkelijk en een hele kleine aanpassing, geen problemen met je clientdatasets ed. en in 5 minuten geregeld. Hadden ze je maar betere training moeten geven.

Duizend wijzen kunnen meer vragen stellen dan één idioot kan beantwoorden.


  • Tyf
  • Registratie: December 2002
  • Laatst online: 28-11-2025
Merci ik ga het proberen morgen :)
Ja kweet het uppen was niet mooi maar wou het die dag nog voor mekaar krijgen.
Dat is dus niet gelukt maar morgen gaan we wel zien

  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 06-05 19:34

Tomatoman

Fulltime prutser

Tyf schreef op vrijdag 22 april 2005 @ 11:39:
De reden was omdat de gebruikers dit gewoon waren van het oude programma en omdat dit voor mij het makkelijker maakte om bepaalde zaken technisch op te lossen.
De berekeningen zijn echt nie zwaar (paar optellingen en aftrekkingen) dus tis niet dat het echt de pc belast.
Dat het oude programma een slecht ontwerp had hoeft niet te betekenen dat jij dat slechte ontwerp overneemt. Dat het voor jou technisch handiger is vind ik een nonargument. Ten eerste zit je nu al een hele tijd te klooien om een probleem op te lossen dat je zelf hebt geschapen met wat jij 'technisch handiger vindt', ten tweede zit je code brak in elkaar als het werkelijk technisch handiger is. Ik vermoed dat je in de OnKeyPress event simpelweg Post doet. Dat valt zeker in de categorie 'brakke code' :)

Een applicatie die waarschuwt bij fouten tijdens het invoeren is zeer irritant. Het is heel gebruikelijk dat je eerst de oude waarde verwijdert en dan pas de nieuwe in de cel typt. Als je dan om je oren wordt geslagen met waarschuwingen dat lege invoer ongeldig is, val je de gebruiker lastig met een waarschuwing waar hij helemaal niet op zit te wachten. Alsof hij dat zelf niet weet! Hij zit niet voor niets een nieuwe waarde te typen en is er nog niet eens mee klaar. Pas bij het verlaten van de cel hoort de controle plaats te vinden. Nog beter: pas bij het verlaten de van record hoort te controle plaats te vinden.

[ Voor 5% gewijzigd door Tomatoman op 24-04-2005 14:19 ]

Een goede grap mag vrienden kosten.


  • Tyf
  • Registratie: December 2002
  • Laatst online: 28-11-2025
Geloof me de gebruiker merkt er niks van, krijg zeker geen ongepaste opmerking ook niet bij een leeg invoerveld, ze krijgen pas een melding als hun ingegeven waarde te groot wordt!
En idd ik vind de huidige oplossing niet goed. Maar zoals ik al zei ik ken niks van delphi en moet erin programmeren. Ik wist toen ik eraan moest beginnen niet eens dat een dbgrid uit Tfields bestond die je zelf appart kan aanspreken en daar ook nog een keer onchange bij hebt. Ik zocht naar een goede oplossing op de dbgrid zelf. Maar dit was niet te vinden en daarom ben ik dan maar na lang zoeken op de huidige manier te werk gegaan. Nu ik al meer van delphi begin te kennen probeer ik dit probleem nu op te lossen.
In plaats van een hele tijd te zeggen dat de code brak is geef een goeide oplossing zoals sommige die mij hier al heel goed geholpen hebben, waarvoor mijn dank!

[ Voor 3% gewijzigd door Tyf op 25-04-2005 08:32 ]


  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 06-05 19:34

Tomatoman

Fulltime prutser

Al lijkt (is) het in het begin complex, er is een heel logische samenhang tussen de data-aware componenten. Let erop dat er heleboel vormen van databasetoegang zijn en dat de componenten die je worden gebruikt worden gedicteerd door de gebruikte database. Zo gebruik je bij ADO de componenten van de 'ADO' tab op het component palette.
[list]• Om een verbinding tot stand te brengen met een database gebruik je een descendant van TCustomConnection, zoals TADOConnection, TDCOMConnection of TDatabase. Deze connection zorgt ervoor dat je gegevens uit een database kunt ophalen en veranderingen in de database kunt aanbrengen.

• Als je gegevens uit een database ophaalt, worden die geretourneerd in een dataset, die altijd een TDataSet descendant is. Meestal gebruik je een SQL query om gegevens uit een dataset op te halen (bijvoorbeeld TADOQuery, TQuery, TSQLDataSet) of een tabelcomponent (TTable, TADOTable). Tabellen zijn in het begin vaak iets gemakkelijker om mee te werken, maar SQL query's zijn veel flexibeler. Er zijn ook componenten die je zowel als SQL query als als tabel kunt gebruiken: TSLDataSet, TADODataSet (zie de CommandType en CommandText properties).

• Als je wijzigingen in een dataset wilt aanbrengen doe je dat normaliter via de TDataSet descendant. Je doet dit met Insert/Edit, dan wijzig je de huidige record en tenslotte doe je Post/Cancel. Kijk vooral goed naar de lijst events van TDataSet. Op het moment dat op de een of andere manier iets gewijzigd wordt/is aan de huidige record, worden een bijbehorend event getriggerd.

• Je kunt natuurlijk ook data-aware controls zoals TDBGrid gebruiken om de gegevens in een dataset te tonen en te wijzigen. Hiertoe verbind je de control met de dataset via een TDataSource (die is er maar in één smaak). Deze controls doen bij gebruikersinvoer zelf de toepasselijke Edit/Post commando's op de dataset, dat hoef je niet zelf te doen. Controls zoals TDBGrid bieden diverse events om te reageren op gebruikersinvoer. Daarbij moet je je wel realiseren dat zo'n event alleen afgevuurd wordt op het moment dat je in die ene control iets typt. Als je in een andere control iets typt, wordt de wijziging wel doorgegeven aan de dataset (die zelf netjes zijn events afwerkt), maar gebeurt er niets met de events in het grid! Dat de data in het grid bij een wijziging toch worden aangepast, komt doordat de dataset aan het grid aangeeft dat de getoonde gegevens ververst moeten worden.
Al met al dien je op gegevenswijzigingen zo veel mogelijk te reageren door de events van de dataset te implementeren en niet zozeer de events van een daaraan gekoppelde control. Wil je bijvoorbeeld controleren of gebruikersinvoer wel geldig is, dan implementeer je BeforePost. Pas op het moment dat de gebruiker klaar is met het editen van de huidige record en naar een andere record wil gaan (dus vlak daarvoor), wordt BeforePost uitgevoerd. Daar voer je de controle uit; als de gebruikersinvoer ongeldig is, voorkom je dat hij de record verlaat door Abort aan te roepen:
Delphi:
1
2
3
4
5
procedure TForm1.MyDataBeforePost(DataSet: TDataSet);
begin
  if DBEdit1.Text = '' then
    Abort;
end;

of
Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
procedure TForm1.MyDataBeforePost(DataSet: TDataSet);
var
  AField: TField;
begin
  AField := MijnDataSet.FieldByName('Lengte');
  if AField.IsNull or (AField.AsInteger < 10) then
  begin
    ShowMessage('Ongeldige lengte. Voer een geldige waarde in of druk ' +
      'op Esc om de wijzigingen te annuleren.')
    Abort;
  end;
end;

Een goede grap mag vrienden kosten.


  • Tyf
  • Registratie: December 2002
  • Laatst online: 28-11-2025
Super, ik denk dat ik met deze oplossing "BeforePost" minder problemen zal hebben dan te werken op het tfield niveau. Bedankt!
Ik zal er straks eens op testen. Ik zal nog weten te zeggen of het gelukt is.
Hopelijk werkt dit goed, dan hebt u van mij een gelukkig mens gemaakt :)

@ReallyStupidGuy
Dat trukje met de cursor lukt met niet. Maar ik denk dat de BeforePost een betere manier zal zijn.
Toch bedankt voor de info

[ Voor 23% gewijzigd door Tyf op 25-04-2005 13:11 ]

Pagina: 1