Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi StringGrid Zeile Kopieren (https://www.delphipraxis.net/119501-stringgrid-zeile-kopieren.html)

SaFu 27. Aug 2008 16:22


StringGrid Zeile Kopieren
 
Hi

Ich versuche gerade den Inhalt einer Zeile vom StringGrid Zu Kopieren, dazu wollte ich sie erstmal makieren, was mir bis jetzt nur so halb gelungen ist.

Jetzt frage ich mich wie mach ich das am besten, die ausgewählte Zeile zu makieren und den Inhalt der Zeile in eine andere ausgwählte Zeil zu kopieren.???

Das ist mein jetziger Lösungsansatz

Delphi-Quellcode:
procedure TForm7.ZeileMakieren1Click(Sender: TObject);
Var i : integer;
begin
for I := 0 to StringGrid1.RowCount -1 do
 begin
  StringGrid1.Selection := TGridRect(Rect(StringGrid1.FixedCols + 2, StringGrid1.RowCount + i , StringGrid1.ColCount -3, StringGrid1.RowCount + i));
 end;
end;

SaFu 28. Aug 2008 09:46

Re: StringGrid Zeile Kopieren
 
Hat da keiner mal einen Vorschlag wie ich den Textbereich einer Zeile eines StringGrids von

Delphi-Quellcode:
FixedCols + 2 {bis} ColCount -3
Kopieren kann und in einen Zeile einfügen kann??

Nogge 29. Aug 2008 00:49

Re: StringGrid Zeile Kopieren
 
Moin fuknersascha,
du sollst als erstes die DelphiPraxis-Suche nutzen. Dafür ist sie schließlich da ;) Es gibt hunderte Einträge zur Selektion einer Zeile. Da ich gerade guter Laune bin, hier noch mal für faule:
Delphi-Quellcode:
StringGrid1.Options := StringGrid1.Options + [goRowSelect]; // aktiviert Selektion der ganzen Zeile anstelle der einen Zelle
StringGrid1.Options := StringGrid1.Options - [goRangeSelect]; // deaktiviert Selektion mehrerer Zeilen
Diese Einstellungen kannste auch im Objektinspektor vornehmen.

Edit:
Aber es sieht so aus, als wollest du deine Selektion nicht per Mausklick realisieren.
Dazu erst einmal:
Delphi-Quellcode:
StringGrid1.Selection
nimmt nur Koordinaten für eine Zelle oder einer ganzen Zeile an bzw. des gesamten StringGrids. Es werden anscheinend nicht mehrere Zellen verschiedener Zeilen unterstützt. Desweiteren stellt ein Rect einen Bereich einer Komponente in Pixel dar. Du kannst also auch nicht einfach für Left einen Spalteindex angeben (Index <> Pixelposition).

Tja, dies musst du wohl selbst programmieren, denn meines Wissens gibt es keine vorprogrammierte Funktion dafür. Ich habe hier mal ein kleines Beispiel für dich:
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
  StringGrid1.Options := StringGrid1.Options + [goRowSelect];  // aktiviert Selektion der ganzen Zeile anstelle der einen Zelle
  StringGrid1.Options := StringGrid1.Options - [goRangeSelect]; // deaktiviert Selektion mehrerer Zeilen

  selList := TList.Create;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  selList.Free;
end;

//---------------------------------------------------------------------------------

procedure TForm1.Button1Click(Sender: TObject);
var
  i: integer;
begin
  for i := StringGrid1.FixedRows to StringGrid1.RowCount-1 do
    selList.Add(i);
  StringGrid1.Invalidate;
end;

procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
var
  this: TStringGrid;
begin
  if (Sender is TStringGrid) then
  begin
    this := TStringGrid(Sender);

    if not (gdSelected in State) then
    begin
      if (ACol >= this.FixedCols) and (ARow >= this.FixedRows) and (selList.IndexOf(ARow) <> -1) then
      begin
        this.Canvas.Brush.Color := clHighlight;
        this.Canvas.Font.Color := clHighlightText;
        this.Canvas.FillRect(Rect);
      end;
    end;
  end;
end;

procedure TForm1.StringGrid1Click(Sender: TObject);
begin
  selList.Clear;
  StringGrid1.Invalidate;
end;
Die selList ist hierbei eine Liste, die Integer-Werte (hier: Zeilenindizes des StringGrids) aufnimmt. Da es keine generischen Listen bis mind. Delphi 7 gibt (nur ein Add-On iwo im Netz), müsstest du dir eine solche Liste auch noch mal programmieren (einfach die Delphi-Suche benutzen - gibt sogar nen Tutorial, wenn ich mich nicht irre).

MfG
Nogge

SaFu 30. Aug 2008 17:12

Re: StringGrid Zeile Kopieren
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Nogge

Danke erstml für deine Antwort und ich hätte vielleicht erwähnen sollen das ich das Kopieren gerne über Rechtsklick auf dem Popup machen würde und die Eigenschaft der einzelzellen makieren als standart beibehalten möchte.

Nur beim rechtsklick und auswahl "Ziele Kopieren" soll die Zeile Kopiert werden.

Das andere Problem ist das ich ein Spezielles SringGrid verwende das Zellen intern teilen kann und auch Texte hinzufügen kann.

Sieht man im Bild.

Zur Zeit Kopiere ich So eine Zelle
Delphi-Quellcode:
 begin
   if (StringGrid1.Col = 0) or (StringGrid1.Col = 8)then
    begin
      exit;
    end
    else
   if StringGrid1.IsSplitted(StringGrid1.Col,StringGrid1.Row) then // abfrage ob Zelle geteilt ist
    begin
      iGesplittet:= 1;
      sKopierenOben:= StringGrid1.GetUpperValue(StringGrid1.Col,StringGrid1.Row);
      sKopierenUnten:= StringGrid1.GetLowerValue(StringGrid1.Col,StringGrid1.Row);
    end
   else
    begin
     iGesplittet:= 0;
     sKopierenOben:= StringGrid1.Cells[StringGrid1.Col,StringGrid1.Row];
     sKopierenUnten:= '';
    end;
end;

Kan man sowas überhaupt noch Realiesieren oder wäre es besser auf VST umsteigen kann die VST sowas??

Nogge 6. Sep 2008 14:26

Re: StringGrid Zeile Kopieren
 
Verstehe da jetzt noch nicht so das Problem. Wenn du ein Rechtsklickmenü verwenden möchtest, schreibste den code aus
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
einfach in den entsprechenden Punkt des Menüs, anstatt ein Button zu benutzen. Desweiteren kannste die Idee mit der SelList trotzdem verwenden. Beim Einfüge bzw. Jopieren kannste dann einfach durch die Indizes, die in der SelList gespeichert sind, auf deine Zeile zugreifen, alle Texte zwspeichern und dann in die gewünschte Zeile einfügen. Dazu brauchste halt nur die SelList global anlegen und der Rest geschieht in der Kopieren-Funktion.

Oder nicht? ;)


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:23 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