Results 1 to 7 of 7

Thread: Focus van cell in DBGrid terugzetten

  1. #1
    John Kuiper
    Join Date
    Apr 2007
    Location
    Almere
    Posts
    8,747

    Focus van cell in DBGrid terugzetten

    Ik heb een DBGRID met een aantal velden (dat is natuurlijk meestal zo). Nu check ik de waarde met SelectedField of deze al in de tabel voorkomt. Als dat zo is, zal de cel van de DBGrid weer terug moeten komen, om alsnog een goede waarde te kunnen plaatsen. Maar dat krijg ik niet voor elkaar.
    Ik heb het volgende geprobeerd:
    - SelectedField.FocusControl. Dit werkt niet. DBGrid is al gefocused.
    - DBGrid.col := DBGrid.Col - 1. Dan krijg ik de melding: invalid index.
    Volgens mij moet er een manier zijn om de verplaatsing naar een andere cel te overriden, waardoor de cursor niet verplaatst naar een andere cell. Ik zou alleen niet weten waar dat zit. Is daar een oplossing voor?
    Delphi is great. Lazarus is more powerfull

  2. #2
    Senior Member Henk Schreij's Avatar
    Join Date
    Sep 2002
    Location
    Heino (Raalte)
    Posts
    1,465
    Je kunt het best ervoor zorgen dat je het veld niet kunt verlaten als de invulling niet klopt. Dat kan op 3 manieren:
    - in de event OnValidate van TField
    - in de property CustomConstraint van TField
    - in de property MinValue of MaxValue (bij een getalveld)

    Als je bij het verlaten van het record wilt valideren dan kun je met FocusControl de cursor op het goede veld zetten. FocusControl kun je zowel bij een DBGrid als bij DBEdits gebruiken, Delphi vindt vanzelf het goede veld.
    Ik raad de OnBeforePost aan om te controleren op Record nivo.
    Vlak na de
    Table1.FieldbyName('Veld').FocusControl
    doe je dan
    raise Exception.Create('Veld is fout ingevuld');

  3. #3
    Silly member NGLN's Avatar
    Join Date
    Aug 2004
    Location
    Werkendam
    Posts
    5,133
    Overigens kun je met SelectedField ook de focus naar een bepaald Field in de huidige record verplaatsen. SelectedField kun je dus uitlezen (zoals je nu blijkbaar doet), maar je kunt hem ook toewijzen.

    Enfin, zorg er inderdaad voor dat je je veld gewoon niet kunt verlaten, da's ook een stuk intuitiever.
    (Sender as TNLDUser).Signature := 'Groeten van Albert';

  4. #4
    John Kuiper
    Join Date
    Apr 2007
    Location
    Almere
    Posts
    8,747
    Quote Originally Posted by Henk Schreij View Post
    Je kunt het best ervoor zorgen dat je het veld niet kunt verlaten als de invulling niet klopt. Dat kan op 3 manieren:
    - in de event OnValidate van TField
    - in de property CustomConstraint van TField
    - in de property MinValue of MaxValue (bij een getalveld)

    Als je bij het verlaten van het record wilt valideren dan kun je met FocusControl de cursor op het goede veld zetten. FocusControl kun je zowel bij een DBGrid als bij DBEdits gebruiken, Delphi vindt vanzelf het goede veld.
    Ik raad de OnBeforePost aan om te controleren op Record nivo.
    Vlak na de
    Table1.FieldbyName('Veld').FocusControl
    doe je dan
    raise Exception.Create('Veld is fout ingevuld');
    In principe wil ik het ook op recordniveau uitvoeren. Als een van de velden niet correct zijn ingevoerd, zal er een cancel op de append komen en de record uit de buffer laten verdwijnen.
    - Onvalidate zie ik niet echt zitten. Deze wordt, zover ik goed heb gelezen, bij elke karakter uitgevoerd. Omdat ik 'extern' in een tabel kijkt of deze al bestaat, krijg ik veel te veel netwerkverkeer voor 1 veld.
    - CustomConstraint ken ik niet en zal daar naar kijken
    - Min- en maxvalue is dus geen optie. Negen van de tien keer is het een string.
    Quote Originally Posted by NGLN
    Overigens kun je met SelectedField ook de focus naar een bepaald Field in de huidige record verplaatsen. SelectedField kun je dus uitlezen (zoals je nu blijkbaar doet), maar je kunt hem ook toewijzen.
    Dat had ik dus al gebrobeerd. Blijkbaar trekt de DBGrid zich er niets van aan. Maar ik gebruik een afgeleide DBgrid van Customgrid, dus daar kan natuurlijk wel een fout in zitten.
    Delphi is great. Lazarus is more powerfull

  5. #5
    John Kuiper
    Join Date
    Apr 2007
    Location
    Almere
    Posts
    8,747
    Ik heb de SelectedField getest op dbgrid op focuscontrol, maar mag niet baten. Maar ik ben toch ver gaan kijken of Onvalidate toch gaat doen wat ik wil. Ik moet je toch gelijk gegen, Henk. Ik heb het niet goed gelezen. Maar waar ga ik deze oproepen? In de eerste instantie heb ik dat in mijn datamodule gedaan. Dat werkt prima, alleen, omdat er een een exception.create() opgeef, zal de uses moeten worden voorzien van een dialog. Dat wil ik juist niet. De datamodule moet gewoon zijn dingen doen, die betrekking hebben op de database / tabellen. Nadeel van een Onvalidate op de datamodule is wel dat je een fieldlist moet creëren om bij de event Onvalidate te komen. Dit doe ik niet voor mijn DBGrids.
    Toch verder gekeken wat SelectedField in zijn mars had. Blijkt dat deze ook een OnValidate event heeft.
    In de OnCreate event van het active formulier deze regel toegevoegd:
    Code:
      DBGrid1.SelectedField.OnValidate := DoValidate;
    Dit werkt als een speer. Had ik eerder moeten bedenken.

    Maar even een andere vraag. Doordat er een raise Exception.Create() wordt uitgevoerd, worden alle andere events van de DBGrid niet uitgevoerd. Maar eigenlijk wil ik een eigen dialog voor gebruiken. Is dat mogelijk en waar moet ik dan naar kijken?
    Delphi is great. Lazarus is more powerfull

  6. #6
    Dat is zeker mogelijk en moet je even naar een nieuwe thread kijken
    Marcel

  7. #7
    John Kuiper
    Join Date
    Apr 2007
    Location
    Almere
    Posts
    8,747
    Toch even nagevraagd op https://forums.codegear.com/thread.j...3338&tstart=30 of het niet een bug is met die focuscontrol. Het volgende antwoord kreeg ik van Peter Below (Team B), wat niet het antwoord is wat ik vroeg.
    Yes, do not validate on input, validate when the user decides to post the record. What you are trying to do is incredibly disruptive to the users workflow and nothing a well-designed user interface should do. You can mark a faulty control in some visual manner and block posting while it contains invalid input, but do not try to force the user back to that control!
    Deze discussie hebben we al vaker gevoerd en blijkt toch maar weer dat de beste validation on recordniveau is.
    Delphi is great. Lazarus is more powerfull

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Tags for this Thread

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •