Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Quellcode Frage zu StringGrids und Logik (https://www.delphipraxis.net/38714-quellcode-frage-zu-stringgrids-und-logik.html)

Barret 23. Jan 2005 11:59


Quellcode Frage zu StringGrids und Logik
 
Hey Leute!
Ich komm grad nich mit der Logik klar.
Und zwar hab ich mehrere StringGrids die editierbar seien sollen. Aer nich, wenn ich in das Feld klicke sondern wenn ich in das feld klicke und dan F2 drücke. Gesagt getan .... Hab das schon mal für ein stringGrid gebastelt gehabt und hab das dan abgeändert. Dafür hab ich noch ein Edit benutzt das erst inviseble is.

Code bei dem es Funktioniert:
Code:
//neue Zeile hinzufügen bzw. löschen & mehr ------------------------------------
procedure TFKondensatorVoreinheiten.SGVoreinheitenKeyDown(Sender: TObject;
  var Key: Word; Shift: TShiftState);
begin
  if (Key = VK_F2) then
    begin
      BrtBearbeiten.Click;
    end;
end;

//Bearbeiten von Zellen --------------------------------------------------------
procedure TFKondensatorVoreinheiten.BBearbeitenClick(Sender: TObject);
begin
    with SGVoreinheiten do
      begin
      //Größe des Editfensters an Größe des StringGrids anpassen
        EdtEditieren.Text := Cells[Col, Row];
        EdtEditieren.Left := CellRect(Col, Row).Left + Left + 2;
        EdtEditieren.Top := CellRect(Col, Row).Top + Top + 2;
        EdtEditieren.Height := CellRect(Col, Row).Bottom - CellRect(Col, Row).Top + 2;
        EdtEditieren.Width := CellRect(Col, Row).Right - CellRect(Col, Row).Left + 2;
      end;
    EdtEditieren.SetFocus;
  end;
end;

//schreiben in StringGrid ------------------------------------------------------
procedure TFKondensatorVoreinheiten.EdtEditierenExit(Sender: TObject);
begin
  EdtEditieren.Visible := false;
  with SGVoreinheiten do
    begin
      Cells[Col,Row] := EdtEditieren.Text; //auf Spalten Text blenden
    end;
end;

//aus Editfeld springen --------------------------------------------------------
procedure TFKondensatorVoreinheiten.EdtEditierenKeyDown(Sender: TObject;
  var Key: Word; Shift: TShiftState);
begin
  if (Key = VK_RETURN) then
    begin
      SGVoreinheiten.SetFocus;
    end;
end;
Zu erläuterun: Edt = Editfeld & SG = StringGrid

jetzt mal der neue Code:
Code:
//Tastaturbedienung für StringGrids --------------------------------------------
procedure TFFVConfig.SGParameterKeyDown(Feld: TStringGrid;
  var Key: Word; Shift: TShiftState);
begin
  if (Key = VK_F2) then
    begin
      EdtEditieren.Visible := true;
      with Feld do
        begin
        //Größe des Editfensters an Größe des StringGrids anpassen
          EdtEditieren.Text := Cells[Col, Row];
          EdtEditieren.Left := CellRect(Col, Row).Left + Left + 21;
          EdtEditieren.Top := CellRect(Col, Row).Top + (Top * 2) + 37;
          EdtEditieren.Height := CellRect(Col, Row).Bottom - CellRect(Col, Row).Top + 2;
          EdtEditieren.Width := CellRect(Col, Row).Right - CellRect(Col, Row).Left + 2;
        end;
      EdtEditieren.SetFocus;
    end;
end;

//*****
procedure TFFVConfig.SGGlueckKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  SGParameterKeyDown(TStringGrid(Sender), Key, Shift);
end;

//Tastaturbedienung für EdtEditieren -------------------------------------------
procedure TFFVConfig.EdtEditierenKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if (Key = VK_RETURN) then
    begin
      if (iStrindGrid_Enter = 1) then SGGlueck.SetFocus;
      if (iStrindGrid_Enter = 2) then SGKondition.SetFocus;
      if (iStrindGrid_Enter = 3) then SGPressing.SetFocus;
      if (iStrindGrid_Enter = 4) then SGRegen.SetFocus;
      if (iStrindGrid_Enter = 5) then SGStaedte.SetFocus;
      if (iStrindGrid_Enter = 6) then SGTemperatur.SetFocus;
    end;
end;

//asus EdtEditierenspringen ----------------------------------------------------
procedure TFFVConfig.EdtEditierenExit(Sender: TObject);
begin
  EdtEditieren.Visible := false;
  if (iStrindGrid_Enter = 1) then SGGlueck.Cells[iStringGrid_Col, iStringGrid_Row] := EdtEditieren.Text;
  if (iStrindGrid_Enter = 2) then SGKondition.Cells[iStringGrid_Col, iStringGrid_Row] := EdtEditieren.Text;
  if (iStrindGrid_Enter = 3) then SGPressing.Cells[iStringGrid_Col, iStringGrid_Row] := EdtEditieren.Text;
  if (iStrindGrid_Enter = 4) then SGRegen.Cells[iStringGrid_Col, iStringGrid_Row] := EdtEditieren.Text;
  if (iStrindGrid_Enter = 5) then SGStaedte.Cells[iStringGrid_Col, iStringGrid_Row] := EdtEditieren.Text;
  if (iStrindGrid_Enter = 6) then SGTemperatur.Cells[iStringGrid_Col, iStringGrid_Row] := EdtEditieren.Text;
end;

//festleegen der Zellen IDs für StringGrids ------------------------------------
procedure TFFVConfig.SGGlueckEnter(Sender: TObject);
begin
  iStrindGrid_Enter := 1;
  iStringGrid_Col := SGGlueck.Col;
  iStringGrid_Row := SGGlueck.Row;
end;

//*****
procedure TFFVConfig.SGKonditionEnter(Sender: TObject);
begin
  iStrindGrid_Enter := 2;
  iStringGrid_Col := SGKondition.Col;
  iStringGrid_Row := SGKondition.Row;
end;

//*****
procedure TFFVConfig.SGPressingEnter(Sender: TObject);
begin
  iStrindGrid_Enter := 3;
  iStringGrid_Col := SGPressing.Col;
  iStringGrid_Row := SGPressing.Row;
end;

//*****
procedure TFFVConfig.SGRegenEnter(Sender: TObject);
begin
  iStrindGrid_Enter := 4;
  iStringGrid_Col := SGRegen.Col;
  iStringGrid_Row := SGRegen.Row;
end;

//*****
procedure TFFVConfig.SGStaedteEnter(Sender: TObject);
begin
  iStrindGrid_Enter := 5;
  iStringGrid_Col := SGStaedte.Col;
  iStringGrid_Row := SGStaedte.Row;
end;

//*****
procedure TFFVConfig.SGTemperaturEnter(Sender: TObject);
begin
  iStrindGrid_Enter := 6;
  iStringGrid_Col := SGTemperatur.Col;
  iStringGrid_Row := SGTemperatur.Row;
end;
Die procedure:
Code:
procedure TFFVConfig.SGGlueckKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  SGParameterKeyDown(TStringGrid(Sender), Key, Shift);
end;
Die IntegerWerte die Ihr öfter seht sind global. Hir noch mal kurz zur Verdeutlichung:
Code:
  iStrindGrid_Enter : Integer = 1; //Definieren der ausgelösten Aktion im EdtEditieren (Keydown)
  iStringGrid_Col : Integer = 1; //Col Angabe für StringGrids
  iStringGrid_Row : Integer = 1; //Row Angabe für StringGrids
Funktioniert übergreifend für alle StringGrids.
Der Fehler im neuen Code ist der, dass er nie die richtige Zelle nimt in der er schreiben soll. Sondern immer die letzte.
Zur Verdeutlichung: letzte Zelle = 2, 2
neue Zelle in der F2 gedrückt ist = 2, 3
Er schreibt mir den Text jetzt aber in die 2, 2.

Der einzige unterschied zwischen den Grids vom alten zum neuen ist nur der, dass die neuen jetzt noch eine einzelne FixedRow haben. Das sollte aber normaler weise nichts ausmachen.

Robert_G 23. Jan 2005 12:12

Re: Quellcode Frage zu StringGrids und Logik
 
Zitat:

Zitat von Barret
Und zwar hab ich mehrere StringGrids die editierbar seien sollen. Aer nich, wenn ich in das Feld klicke sondern wenn ich in das feld klicke und dan F2 drücke.

Einfach mal in den Options des StringGrid goEditing auf true setzen. ;)

Barret 23. Jan 2005 12:16

Re: Quellcode Frage zu StringGrids und Logik
 
Ja auf die Idee wär ich ja auch schon gekommen, wenn das so funktionieren sollte. Solls aber nich. Das soll verhindern, dass da son Dau kommt und irgendwo hinklickt und was verändert was er gar nich ändern will.

Robert_G 23. Jan 2005 12:22

Re: Quellcode Frage zu StringGrids und Logik
 
Zitat:

Zitat von Barret
Ja auf die Idee wär ich ja auch schon gekommen, wenn das so funktionieren sollte. Solls aber nich. Das soll verhindern, dass da son Dau kommt und irgendwo hinklickt und was verändert was er gar nich ändern will.

Er müsste dafür einen Doppelklick machen. Und das ist genau das Verhalten, das er aus dem Explorer und allen anderen Programmen kennt: Einfach klicken selektieren, Doppelklick/F2 editieren.

Barret 23. Jan 2005 13:37

Re: Quellcode Frage zu StringGrids und Logik
 
ja... Ich weiss worauf du hinauswillst. Aber ich würd trotzdem erst mal geklärt haben warum das so nicht funktioniert. Irgendwo muss doch da ein Fehler sein.

Wenn das noch irgendwie relewand is, die StringGrids sind auf einem TaSheet verteilt.

So wie ich das geplant hab wär das schon ein bissel professioneller oder nich??? Auserdem hab ich für das Programm noch ein Jahr Zeit. Das wird eine Simulation für die Berufsschule die jeder im dritten Lehrjahr abgeben muss. Nur für den den es interressiert natürlich.


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:54 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz