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.