2016-10-15 5 views
0

Моя программа должна считывать данные из текстового файла, который используется для установки значений цветов ячеек 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; 
+0

О, извините, я забыл добавить, что я все равно могу изменить цвета ячеек при нажатии на них, а также получить правильный вывод при запуске. – Ragglepop

+0

Покраска сетки в OnActivate формы бессмысленна, ячейки будут перечерчены в OnCellDrawn. –

+0

Вы понимаете, что координаты строк и столбцов основаны на нулевом значении, а не на 1, поскольку вы, кажется, предположили? – MartynA

ответ

4

Хорошо, я понял. Спасибо всем, кто указал на логические ошибки! Да. Мои столбцы должны были начинаться с iCols = 0 до iColumnCount-1 для iRows. Кроме того, на том месте, где я установить 2D цвет, который я должен был изменить его на следующее:

arr2DColor[iPatients,k+1]:=StrToInt(CopyNext); 

И где я установил текст для iCol = 0 и IRow = 0 Я изменил его следующим образом:

StringGrid.Cells[0,iRow+1]:=arrNames[iRow]; 
StringGrid.Cells[iCol+1,0]:=arrColumnName[iCol]; 

Также arrColors должно иметь значение 1,2 или 3 (вместо значения int для цвета) в качестве параметра, из которого arrColors выбирает цвет из этого параметра, поэтому мне пришлось изменить текстовый файл следующим образом:

Karel Bezuidenhoudt/1/2/0/0/ Jan Pieterse/0/0/0/0/ Фрик Bezuidenhoudt/0/0/0/0/ Меган Смит/0/1/2/3/

И код OnDrawCell следующим

procedure TForm1.StringGridDrawCell(Sender: TObject; ACol, ARow: Integer; 
    Rect: TRect; State: TGridDrawState); 
const 
    clOrange = TColor($008CFF); 
    CellColors: array[0..3] of TColor = (clWhite, 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; 

Опять спасибо большое за отзывы !

+0

Хорошо сделано для того, чтобы разобраться в себе и сказать, как вы его исправили.+1 – MartynA

+0

Был еще один ошибка, так что я cahnged его следующим образом: – Ragglepop

+0

для IRow: = 0 до iPatients делать начинают для iCol: = 0 до iColumnCount делать начинают 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]; конец; – Ragglepop