[Delphi] Hoe kolom blokkeren in stringgrid

Pagina: 1
Acties:
  • 122 views sinds 30-01-2008
  • Reageer

  • Dommel
  • Registratie: Maart 2001
  • Laatst online: 18-08 11:30

Dommel

Professioneel Software Sloper

Topicstarter
Normaal gesproken ben ik niet op dit stuk van GoT te vinden maar nu ben ik het wel verplicht aangezien ik een probleem heb waar ik niet meer uit kom. In mijn applicatie heb ik een StringGrid staan. Ik heb een cel gehighlight en kan de waarde hiervan uitlezen en ik kan deze invullen d.m.v. een random functie. Echter wanneer ik mijn StringGrid aan het vullen ben moet dit per kolom gebeuren, dit lukt ook. Nu de kern van mijn probleem: de andere kolommen mogen niet geselecteerd kunnen worden zodat je alleen de kolom die gevuld wordt kunt uitlezen. Hoe kan ik nu de andere kolommen blokkeren en de geselcteerde kolom niet. Ik dacht dit te doen d.m.v. de volgende code, die de cellen kleurt en ook meteen blokkeert:

Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
procedure TForm_MeetResultaat.StringGrid1DrawCell(Sender: TObject;
                       ACol, ARow: Integer; Rect: TRect; State: TGridDrawState);
begin
  with (Sender as TStringGrid), Canvas do
    begin
      Brush.Style := bsSolid;
      if ((ACol = ColSelect) and (ARow = RowSelect)) then
        begin
          Brush.Color := clLime;
          Font.Color:=clBlack;
        end
      else if (ACol = Colselect) then  
        begin
          Brush.Color := clWindow;
          Font.Color := clGray;
          StringGrid1.Enabled := False;  // <== levert foutmelding op
        end
      else
        begin
          Brush.Color := clMedGray;
          Font.Color := clBlack;
        end;
      SetTextAlign(Handle, TA_CENTER);
      TextRect(Rect, (Rect.Left + Rect.Right) div 2, Rect.Top + 2, Cells[ACol, ARow]);
      if (gdFocused in State) then DrawFocusRect(Rect)
    end;
end;


Door gebruik van de regel (StringGrid1.Enabled := False; ) krijg ik de volgende foutmelding: Cannot focus a disabled or hidden window. Deze manier werkt dus niet. Maar hoe krijg ik het dan wel voor elkaar :?
Ik neem aan door op de een of andere manier voor elke kolom te kijken of dat dit de geselecteerde kolom is en deze dan te enablen, maar hoe doe ik dat :?

Programmeeromgeving : Borland Delphi 6

De code komt van NLDelphi.com en werkt goed

Lego Taj Mahal te koop --> https://gathering.tweakers.net/forum/list_messages/2109838


  • Sicos
  • Registratie: Februari 2001
  • Laatst online: 07:26
Vrij simpel probleem...

Gewoon de volgende code gebruiken...

In het SelectCell event een soort gelijke code plaatsen als deze

procedure TfrmMain.sgParametersSelectCell(Sender: TObject; ACol,
ARow: Integer; var CanSelect: Boolean);
begin
if not (goEditing in sgParameters.Options) then exit;
if ACol = 1 then
begin
CellBuf := sgParameters.Cells[ACol, ARow];
CanSelect := True; // <<< Deze geeft aan of je een cell mag bewerken of niet
end
else
CanSelect := False;
end;

Denk dat je hier wel genoeg aan hebt...


Greetings Sicos

  • Dommel
  • Registratie: Maart 2001
  • Laatst online: 18-08 11:30

Dommel

Professioneel Software Sloper

Topicstarter
Bedankt voor de code maar hij doet het niet helemaal of is het zo dat ik nu goEditing nu op True dien te zetten :? Als ik dat doe dan komt het al wel dichter in de buurt van wat ik wil, helemaal als ik van ACol = 1 maak ACol = ColSelect. Dan krijg ik de goede kolom, echter ik kan nu nog steeds andere kolommen selecteren en dat wil ik nou net niet.

Niet om vervelend te zijn maar of ik nu wel of niet jouw code gebruik er verandert wat betreft hetgeen wat mijn programma doet eigenlijk niks. Dit is dus helaas niet hetgeen wat ik zoek :'(

[edit]
Ook d.m.v. het voor elke cel nalopen wil het mij niet lukken om de andere kolommen te blokkeren.
Ik heb het programma al wel zover dat ik de metingen in de juiste kolom krijg maar de gebruikers kennende zal er ook wel op de verkeerde kolom gedurkt worden wat dus gedisabled dient te worden.

[ Voor 23% gewijzigd door Dommel op 06-03-2003 13:23 ]

Lego Taj Mahal te koop --> https://gathering.tweakers.net/forum/list_messages/2109838


  • Dommel
  • Registratie: Maart 2001
  • Laatst online: 18-08 11:30

Dommel

Professioneel Software Sloper

Topicstarter
JOEPIE het is me dan toch gelukt om het voor elkaar te krijgen zij het wel op een ranzige manier.

Mijn oplossing:
de regel StringGrid1.Enabled := false; toevoegen op de plek waar hij nu staat (regel 16) en op regel 22 invoegen. Vervolgens bij de meting die ik laat uitvoeren als eerste de aanroep StringGrid1.Enabled := True; en pas nadat ik de waarde in de cel heb geschreven de SelectCell procedure aanroepen.

Gevolg: geen enkelen cel is zomaar mee aan te klikken, alle kolommen zijn dus geblokkeerd. Maar dat geeft niks want de gebruiker kan met 2 pijltoetsen ook van cel wisselen en dat werkt nog steeds.

Lego Taj Mahal te koop --> https://gathering.tweakers.net/forum/list_messages/2109838


  • Dommel
  • Registratie: Maart 2001
  • Laatst online: 18-08 11:30

Dommel

Professioneel Software Sloper

Topicstarter
Sorry voor de bump maar met behulp van een collega heb ik nu een wat nettere manier gevonden om dit op te lossen.

In de procedure SelecCell doe ik nu de volgende aanroep:
if ACol <> BepaalKolom(now) then Canselect := false;

Op deze manier mag er nu in de gehele kolom naar hartelust worden geklikt maar je kunt niet meer een andere kolom kiezen :)

Lego Taj Mahal te koop --> https://gathering.tweakers.net/forum/list_messages/2109838


  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Erm.... Sicos heeft je die oplossing al gegeven hoor...

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


  • Dommel
  • Registratie: Maart 2001
  • Laatst online: 18-08 11:30

Dommel

Professioneel Software Sloper

Topicstarter
Niet helemaal want op dat moment kon ik nog steeds een cel in een andere kolom selecteren. Dat is nu niet mogelijk.

Lego Taj Mahal te koop --> https://gathering.tweakers.net/forum/list_messages/2109838

Pagina: 1