Como excluir uma linha do StringGrid ???

Delphi

07/07/2005

Colegas..

Como fazer para excluir uma linha do StringGrid, assim como um registro do DBGrid?


Cabelo

Cabelo

Curtidas 0

Respostas

Cabelo

Cabelo

07/07/2005

Sobe... :(


GOSTEI 0
Massuda

Massuda

07/07/2005

Como fazer para excluir uma linha do StringGrid...
Via de regra, você deve popular novamente o StringGrid excluindo a linha (mude o RowCount se for o caso); se for a última linha, não há necessidade de repopular o StringGrid.


GOSTEI 0
Cabelo

Cabelo

07/07/2005

Isso é um grande problema.., eu imaginei e fiz assim.. mas... fica bem lento.., tenho uns 2000 registros por vez..

Mas me diga uma coisa.. pra que serve o método delete() do string grid?


GOSTEI 0
Massuda

Massuda

07/07/2005

...pra que serve o método delete() do string grid?
Não encontrei um método TStringGrid.Delete... tem certeza?

Uma alternativa, seria ajustar a altura da linha em zero, mas o resultado (esteticamente) pode não agradar.


GOSTEI 0
Cabelo

Cabelo

07/07/2005

O método é da linha..


stringgrid1.rows[Nº da linha].delete...


a mensagem de erro que me consta é :

Não é possível inserir ou excluir linhas do string grid..

talvez seja um bug do delphi??

Pq se não for, porquê existe esse método?


GOSTEI 0
Massuda

Massuda

07/07/2005

stringgrid1.rows[Nº da linha].delete...
TStringGrid.Rows (assim como TStringGrid.Cols) é uma propriedade que retorna um TStrings de modo que você tem acesso ao texto em uma linha do grid através de uma lista; portanto, o texto em uma determinada posição dessa lista é o texto de uma das colunas (naquela linha). Você pode usar essa lista para alterar o conteúdo do grid.

O método Delete (e o método Insert) existe porque ele faz parte dos métodos de uma lista TStrings, mas, do modo como está implementado no StringGrid (classe TStringGridStrings na unit Grids), você não pode inserir ou deletar strings do grid através desse método (não sei o motivo, precisaria estudar o fonte).


GOSTEI 0
Cabelo

Cabelo

07/07/2005

[quote:4168ec6250=´Cabelo´]stringgrid1.rows[Nº da linha].delete...
TStringGrid.Rows (assim como TStringGrid.Cols) é uma propriedade que retorna um TStrings de modo que você tem acesso ao texto em uma linha do grid através de uma lista; portanto, o texto em uma determinada posição dessa lista é o texto de uma das colunas (naquela linha). Você pode usar essa lista para alterar o conteúdo do grid.

O método Delete (e o método Insert) existe porque ele faz parte dos métodos de uma lista TStrings, mas, do modo como está implementado no StringGrid (classe TStringGridStrings na unit Grids), você não pode inserir ou deletar strings do grid através desse método (não sei o motivo, precisaria estudar o fonte).[/quote:4168ec6250]

Bug.. concorda????


GOSTEI 0
Orpolonio

Orpolonio

07/07/2005

vc tem q mover as linhas abaixo da selecionada para cima,,,,e 2000 registros n demora tanto assim.


GOSTEI 0
Cabelo

Cabelo

07/07/2005

vc tem q mover as linhas abaixo da selecionada para cima,,,,e 2000 registros n demora tanto assim.


Colega..

se você tivesse lido todo o tópico saberia que isso que você propôs eu já faço..

mas acredito ser uma certa ´gambiarra´, por isso postei este tópico, para saber se exitiria uma outra forma de fazer isso, uma forma mais profissional. Fiz isto pois ví o método .delete() do TStrings, sendo usado depois do método Rows, e achei que deveria tentar investigar se dava ou não pra usar..

Ao que me parece a borland simplesmente usou a classe TStrings, herdando todos os seus métodos, mas não ´tratou´ o método .delete() e .insert(), no StringGrid, ou eu que não estou sabendo utilizar este método..


GOSTEI 0
Massuda

Massuda

07/07/2005

Ao que me parece a borland simplesmente usou a classe TStrings, herdando todos os seus métodos, mas não ´tratou´ o método .delete() e .insert(), no StringGrid...
Sim, é isso que aconteceu. Quem implementou o StringGrid decidiu que não teria Insert nem Delete.


GOSTEI 0
Márcio

Márcio

07/07/2005

Peguei um materia no forum e fiz umas alterações.

...
procedure gridSelectCell(Sender: TObject; ACol, ARow: Integer; var CanSelect: Boolean);
private
{ Private declarations }
public
{ Public declarations }
end;

var
FrmNotaFiscal: TFrmNotaFiscal;
SelectRow,SelectCol:integer;
TextRow,TextRow1,Temp2:string;
Primeiro:boolean; //Variável para verificar se é a primeira inserção

type
TStringGridX = class(TStringGrid)
public
procedure MoveColumn(FromIndex, ToIndex: Longint); //Nos permite mover colunas
procedure MoveRow(FromIndex, ToIndex: Longint); //Nos permite mover linhas
end;

implementation

uses UDM, TFrm1;

{$R *.dfm}

procedure TStringGridX.MoveColumn(FromIndex, ToIndex: Integer); // essa não sei o que faz
begin
inherited;
end;

procedure TStringGridX.MoveRow(FromIndex, ToIndex: Integer);// essa tb não sei o que faz
begin
inherited;
end;

Procedure DeletaLinha(Grid:TStringGrid); {*}
var i:integer;
SelectRow, SelectCol : integer;
begin
SelectRow := grid.Row; {*}
SelectCol := grid.Col; {*}
if Grid.RowCount > 2 then //Se o StringGrid possuir mais de uma linha
begin
for i:=0 to Grid.ColCount do {*}
Grid.Cells[i,SelectRow]:=´´; {*}
TStringGridX(Grid).MoveRow(SelectRow,Grid.RowCount); //A linha selecionada é movida para o final do StringGrid
Grid.RowCount:=Grid.RowCount -1;
{A última linha do StringGrid, justamente a que foi selecionada e movida para
o final, é deletada, dando uma idéia de todas as celulas se moverem para
cima sem precisar usar for, ou while}
end
else
begin //Se o StringGrid possuir apenas uma linha os dados somente são apagados
for i:=0 to Grid.ColCount do
Grid.Cells[i,1]:=´´;
primeiro:= true; //como o StringGrid está vazio o próximo dado novamente será o primeiro
end;
grid.Col := 0; {*}
end;

procedure MouseCell(Grid: TStringGrid;
var Coluna, Linha: integer);
var
Pt: TPoint;
begin
GetCursorPos(Pt);
Pt := Grid.ScreenToClient(Pt);
if PtInRect(Grid.ClientRect, Pt) then
Grid.MouseToCell(Pt.X, Pt.Y, Coluna, Linha)
else
begin
Coluna := -1;
Linha := -1;
end;
end;

procedure TFrm1.gridSelectCell(Sender: TObject; ACol, ARow: Integer; var CanSelect: Boolean);
begin
SelectRow := ARow; //A variável global SelectRow recebe a coordenada da linhaselecionada
SelectCol := ACol; //A variável global Selectcol recebe a coordenada da coluna selecionada
end;

{* - alerações que eu fiz}
{Desenvolvimento e Matéria por Lindomir Avelar
lindomir@arcosnet.com.br}

Um abraço.

Márcio.


GOSTEI 0
POSTAR