Einzelnen Beitrag anzeigen

Benutzerbild von Barret
Barret

Registriert seit: 27. Mai 2004
53 Beiträge
 
#1

Quellcode Frage zu StringGrids und Logik

  Alt 23. Jan 2005, 11:59
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.
  Mit Zitat antworten Zitat