Hallo, ich bastel grad an einem Stringgrid bei dem ich direkt beim Markieren einer leeren Spalte jeweils die Minutenwerte aus einer anderen Spalte addiert möchte.
Ich hab auf einem Formular einen DateTimePicker und ein Stringgrid mit ca. 1000 Zeilen und 2 Spalten
Die linke Spalte ist leer und rechts davon habe ich eine Spalte mit unterschiedlichen Zahlen(Minutenwerte) von 1 bis 10.
Ich möchte nun mit der Maus oder per Tastatur einen Bereich in der leeren Spalte markieren.
Es soll nun ab Beginn der Markierung bis zu einer bestimmten Zeile die Zeit des DateTimePickers plus der in der rechten Spalte entsprechende Minutenwert hinzuaddiert und eingetragen werden.
(ähnlich wie in Excel)
Dabei soll der Zeitwert der nächsten Reihe natürlich um den Minutenwert der rechten Spalte erhöht werden.
DateTimePicker hat das Datum/Zeit : 03.03.2016 - 09:00
Tabelle vor dem Markieren der leeren Spalte
STARTZEIT | MINUTEN |
| 2 |
| 1 |
| 4 |
| 5 |
| 3 |
| 4 |
| 2 |
Nach dem Markieren der leeren Spalte soll der fertige Stringgrid dann etwa so aussehen:
STARTZEIT | MINUTEN |
03.03.2016 09:02 | 2 |
03.03.2016 09:03 | 1 |
03.03.2016 09:07 | 4 |
03.03.2016 09:12 | 5 |
03.03.2016 09:15 | 3 |
03.03.2016 09:19 | 4 |
03.03.2016 09:21 | 2 |
Hab folgendes bereits geschrieben. Ist aber noch nicht das gelbe vom Ei
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
var
i: integer;
const
ZufallMinuten = 5;
begin
sg1.Cells[0, 0] := 'Startzeit';
sg1.Cells[1, 0] := 'Minuten';
Randomize;
for i := 1 to sg1.RowCount - 1 do
sg1.Cells[1, i] := IntToStr(Random(ZufallMinuten) + 1); // zufällige Minutenzahl zwischen 1 und 5 für Spalte Minuten
end;
procedure TForm1.sg1DrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState);
const
SelectedColor = clyellow;
begin
if (state = [gdSelected]) then
with TStringGrid(Sender), Canvas do
begin
Brush.Color := SelectedColor;
FillRect(Rect);
TextRect(Rect, Rect.Left + 2, Rect.Top + 2, Cells[ACol, ARow]);
sg1.Cells[Acol, ARow] := DateTimeToStr(IncMinute(StrToDateTime(sg1.Cells[ACol, ARow - 1]),StrToInt(sg1.Cells[ACol+1,ARow])));
end;
end;
procedure TForm1.sg1SelectCell(Sender: TObject; ACol, ARow: Integer; var CanSelect: Boolean);
begin
sg1.Cells[Acol, ARow] := DateTimeToStr(DateTimePicker1.DateTime); //Erste Markierungszeile mit DateTime füllen
end;
Für ein paar Verbesserungen wäre ich dankbar.