Моя программа должна считывать данные из текстового файла, который используется для установки значений цветов ячеек differnet при запуске. Однако это не так, поскольку ячейки окрашены в черный цвет при запуске, а не в желаемом цвете. Ниже приведены значения, которые я использовал в моем текстовом файле ('Columns.txt') (* Примечание: 16777215/= белый, 32768 = зеленый):Delphi 7: StringGrid Событие DrawCell окрашивает все ячейки в черный цвет при запуске
Карел Bezuidenhoudt/16777215/32768/16777215/16777215/ Ян Питерс/16777215/16777215/16777215/16777215/ Фрик Bezuidenhoudt/16777215/16777215/16777215/16777215/ Меган Смит/16777215/16777215/16777215/16777215/
Here is a screenshot of my main form
This is the output I am currently getting
Вместо того, чтобы все столбцы должен быть белым, за исключением ячейки во втором столбце первой строки, который должен быть зеленым, как указано текстовым файлом
Текущий код выглядит следующим образом (извиняюсь за все остальные случайные коды и переменные):
private
iHideAddPatient,iHideAddCol,iColumnCount,iGenerates,iChangeColor,MouseX,LeftPos,iColValue,iColorValue,iAddField,iShowHide,iPos,iLoopCount,iPatients,iRowOrder,iRowCount:Integer;
**sLine,sTextValues:string;**
**tColumns,tNames:TextFile;**
PnlTest0:TPanel;
PnlField,PnlFieldlbl,pnlPatient,PnlName:TPanel;
PnlColor,PnlColor2,PnlColor3,PnlColor4,PnlColor5,PnlColor6,PnlColor7:TPanel;
btnColor1:TButton;
arrNotes:array[1..400] of string;
arrFieldName:array[1..400] of string;
arrColumnName:array[1..400] of string;
arrColor:array[1..4] of Integer;
**arrNames:array[1..400] of string;**
**arrColCount:array[1..400] of Integer;**
arr2DColor:array[1..100,0..100] of Integer;
procedure GenerateField;
procedure DeleteDone;
procedure SortA;
procedure ChangeColor(k,l:Integer;paneltype:pnlType);
procedure ChangeColor1;
function CopyNext:string;
function FindPos:Integer;
function RemoveSpaces(sName:string):string;
procedure TForm1.FormActivate(Sender: TObject);
var
k,iRow,iCol:Integer;
TheRect:TRect;
begin
pnlColomb.BringToFront;
pnlAddPatient.BringToFront;
pnlColomb.Visible:=False;
pnlAddPatient.Visible:=False;
StringGrid.ColWidths[0]:=200;
sTextValues:='/None/Not received/Received/Analysed/0/';
redtTest.lines.Clear;
iHideAddPatient:=0;
iHideAddCol:=0;
iLoopCount:=1;
iPatients:=0;
iRowCount:=0;
iColumnCount:=0;
iShowHide:=0;
AssignFile(tColumns,'Columns.txt');
//Append(tColumns);
try
Reset(tColumns);
except
Showmessage('Textfile missing') ;
Exit;
end;
while not Eof(tColumns) do
begin
Inc(iColumnCount);
Readln(tColumns,sLine);
if sLine=''
then
begin
CloseFile(tColumns)
end
else
begin
arrColumnName[iColumnCount]:=CopyNext;
DeleteDone;
end;
end;
CloseFile(tColumns);
AssignFile(tNames,'Patients.txt');
try
Reset(tNames);
except
ShowMessage('Patients.txt doesn''t exist');
Exit;
end;
while not Eof(tNames) do
begin
Inc(iPatients);
Readln(tNames,sLine);
arrNames[iPatients]:=CopyNext;
DeleteDone;
for k:=1 to iColumnCount do
begin
arr2DColor[iPatients,k]:=StrToInt(CopyNext);
//ShowMessage(IntToStr(iPatients)+':'+IntToStr(k)+' = '+inttostr(arr2DColor[iPatients,k]));
DeleteDone;
end;
redtTest.Lines.Add('Name:'+IntToStr(iPatients)+' '+arrNames[iPatients]);
end;
for iRow := 1 to iPatients do
begin
for iCol := 1 to iColumnCount do
begin
StringGrid.Canvas.Brush.Color:=arr2DColor[iRow,iCol];
TheRect:=StringGrid.CellRect(iCol,iRow);
StringGrid.Canvas.FillRect(TheRect);
StringGrid.Cells[0,iRow]:=arrNames[iRow];
StringGrid.Cells[iCol,0]:=arrColumnName[iCol];
end;
end;
end;
procedure TForm1.btnAddClick(Sender: TObject);
begin
if iShowHide=0 then
begin
pnlColomb.Visible:=True;
iShowHide:=1;
end
else
begin
pnlColomb.Visible:=False;
iShowHide:=0;
end;
end;
procedure TForm1.DeleteDone;
begin
Delete(sLine,1,FindPos);
end;
function TForm1.FindPos: Integer;
begin
Result:=Pos('/',sLine);
end;
function TForm1.CopyNext: string;
begin
Result:=Copy(sLine,1,FindPos-1);
end;
код я использую, чтобы изменить цвета ячеек, когда я нажимаю на них следующим образом (и я считаю, что я скопировал весь необходимый код, но дайте мне знать, если что-то кажется, отсутствует):
procedure TForm1.StringGridDrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
const
clOrange = TColor($008CFF);
CellColors: array[0..3] of TColor = (16777215, clRed, clOrange, clGreen);
begin
if (ACol in [1..iColumnCount]) and (ARow in [1..iPatients]) then
begin
StringGrid.Canvas.Brush.Color := CellColors[arr2Dcolor[ARow, ACol]];
StringGrid.Canvas.FillRect(Rect);
end;
end;
type
TStringGridAccess = class(TStringGrid)
end;
procedure TForm1.StringGridSelectCell(Sender: TObject; ACol, ARow: Integer;
var CanSelect: Boolean);
begin
if (ACol in [1..iColumnCount]) and (ARow in [1..iPatients]) then
begin
arr2DColor[ARow, ACol] := (arr2dColor[ARow, ACol] + 1) mod 4;
TStringGridAccess(StringGrid).InvalidateCell(ACol, ARow);
end;
if (ACol=0) and (ARow>0) then
begin
ShowMessage(arrNotes[ARow]);
TStringGridAccess(StringGrid).InvalidateCell(ACol, ARow);
end;
end;
О, извините, я забыл добавить, что я все равно могу изменить цвета ячеек при нажатии на них, а также получить правильный вывод при запуске. – Ragglepop
Покраска сетки в OnActivate формы бессмысленна, ячейки будут перечерчены в OnCellDrawn. –
Вы понимаете, что координаты строк и столбцов основаны на нулевом значении, а не на 1, поскольку вы, кажется, предположили? – MartynA