Hallo!
ich habe folgende
DLL-Datei:
Delphi-Quellcode:
library pwv;
uses
ShareMem, SysUtils, Classes, Grids;
{$R *.res}
// Sortiert das StringGrid "GenStrGrid" im der Spalte "ThatCol"
procedure SortGrid(var GenStrGrid: TStringGrid; ThatCol: Integer); stdcall;
const
// Define the Separator
TheSeparator = '@';
var
CountItem, I, J, K, ThePosition: integer;
MyList: TStringList;
MyString, TempString: string;
begin
// Give the number of rows in the StringGrid
CountItem := GenStrGrid.RowCount;
//Create the List
MyList := TStringList.Create;
MyList.Sorted := False;
try
begin
for I := 1 to (CountItem - 1) do
MyList.Add(GenStrGrid.Rows[I].Strings[ThatCol] + TheSeparator +
GenStrGrid.Rows[I].Text);
//Sort the List
Mylist.Sort;
for K := 1 to Mylist.Count do
begin
//Take the String of the line (K – 1)
MyString := MyList.Strings[(K - 1)];
//Find the position of the Separator in the String
ThePosition := Pos(TheSeparator, MyString);
TempString := '';
{Eliminate the Text of the column on which we have sorted the StringGrid}
TempString := Copy(MyString, (ThePosition + 1), Length(MyString));
MyList.Strings[(K - 1)] := '';
MyList.Strings[(K - 1)] := TempString;
end;
// Refill the StringGrid
for J := 1 to (CountItem - 1) do
GenStrGrid.Rows[J].Text := MyList.Strings[(J - 1)];
end;
finally
//Free the List
MyList.Free;
end;
end;
// Löscht die Zeile "RowNumber" des StringGrids "Grid", die gerade markiert ist
procedure GridDeleteRow(RowNumber : Integer; Grid : TStringGrid);stdcall;
var
i : Integer;
begin
Grid.Row := RowNumber;
if (Grid.Row = 0) then else
If (Grid.Row = Grid.RowCount -1) then
begin
Grid.RowCount := Grid.RowCount - 1;
end
else
begin
for i := RowNumber to Grid.RowCount - 1 Do
begin
Grid.Rows[i] := Grid.Rows[i+ 1];
end;
Grid.RowCount := Grid.RowCount - 1;
end;
end;
exports
SortGrid,
GridDeleteRow;
begin
end.
Die Datei ("pwv.dll") wir im Programm eingebunden:
Delphi-Quellcode:
unit UHaupt;
interface
uses
// ...
type
// ...
procedure SortGrid(
var GenStrGrid: TStringGrid; ThatCol: Integer);
stdcall;
procedure GridDeleteRow(RowNumber : Integer; Grid : TStringGrid);
stdcall;
implementation
{$R *.DFM}
procedure SortGrid(
var GenStrGrid: TStringGrid; ThatCol: Integer);
stdcall;
external '
pwv.dll';
procedure GridDeleteRow(RowNumber : Integer; Grid : TStringGrid);
stdcall;
external '
pwv.dll';
Und So werden Sie zur Laufzeit aufgerufen:
SortGrid(SGP, Column) //SGP ist der Name des StringGrids und Colum ist die Spalte ;
GridDeleteRow(SGP.Row,SGP); //SGP.Row übergibt die zurzeit markierte Spalte des StringGrids SGP
Folgendes Problem:
Das Programmstartet, ich lade eine datei in das stringgrid und klicke auf einen spaltenkopf. das grid wird von dieser spalte ausgehend alphabetisch sortiert. jedoch bei einem zweiten klick (auf die gleiche oder eine andere spalte) tritt ein fehler auf:
"Im Projekt Projektwochenverwlatung.exe ist eine Exception der Klasse EAccessViolation aufgetreten. Meldung: 'Zugriffsverletzung bei Adresse 00402296 in Modul 'Projektwochenveraltung.exe'. Schreiben von Adresse 30402969'. Prozess wurde angehalten. Mit Einzelne Anweisung oder Start fortsetzen."
und nun zum zweiten problem. wenn ich eine zeile aus dem grid lösche, kommt folgenden fehlermeldung:
"Im Projekt Projektwochenverwlatung.exe ist eine Exception der Klasse EConvertError aufgetreten. Meldung: 'TStringGridStrings kann nicht zu TStringGridString zugewiesen werden'. Prozess wurde angehalten. Mit Einzelne Anweisung oder Start fortsetzen."
Ich weiß nicht mehr weiter!
hat jemand eine idee, wie man das problem beheben kann?
Veieln Dank!
Gruß, dopeline