2017-02-22 4 views
0

Am, имеющей строку сетки (TStringGrid) с 2 столбца и 1 ряд (Property: ColCount = 2 & Rowcount = 1.читать текст из TStringGrid клеток [AcOl, Arow], который генерируется с помощью функции DrawText на "OnDrawCell" событие

Код для OnDrawCell Событие:

procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer; 
    Rect: TRect; State: TGridDrawState); 
    var 
    Parametertext : string; 
begin 
    case ACol of 
    0 : Parametertext := 'Test'; 
    1 : Parametertext := 'Test1'; 
    end; 
    stringgrid1.Brush.Color := clBtnFace; 
    stringgrid1.Font.Color := clWindowText; 
    stringgrid1.Canvas.FillRect(Rect); 
    DrawText(stringgrid1.Canvas.Handle, PChar(parameterText), -1, Rect, 
     DT_SINGLELINE); 
end; 

При запуске приложения, я получаю ниже вывод: Sample Output

Вопрос:

Когда я пытаюсь получить текст с помощью StringGrid1.Cells[0,0], StringGrid1.Cells[1,0],

я, кроме «Тест» & «Test1», но она всегда дает пустую строку «».

Как получить текст из строковой сетки, используя StringGrid.Cells[aCol,aRow]?

+1

Я согласен с ответом @ Dsm, но почему вы делаете то, что делаете на мероприятии DrawCell, в первую очередь? Почему бы не назначить значения ячеек в коде, а затем оставить сетку для рисования? – MartynA

+0

Текст там отсутствует. Вы нарисовали (используя ** DRAWText **) текст, назначенный локальной переменной. Почему вы тогда ожидаете, что содержимое локальной переменной будет волшебным образом сохранено в ячейках? Все, что вы сделали, ** нарисовано **. Вот волшебство, которое вы ищете - удалите обработчик OnDrawCell и создайте обработчик OnCreate для формы. Добавьте эти две строки: 'StringGrid1.Cells [0, 0]: = 'Test'; StringGrid1.Cells [1, 0]: = 'Test1'; '. Магия. –

+0

Этот существующий код не новый, у меня нет прав на его изменение. Один и тот же тип кода интегрирован с большим приложением, и я пытаюсь получить значение Grid из инструмента автоматизации (например, завершение теста) ... – bejarun

ответ

3

Вы генерируете текст для его рисования, но не для его хранения. Вы также должны установить значение stringGrid.Cells, возможно, не в событии OnDrawCell.

Подумайте о своей переменной Parametertext. Это локальная переменная, уничтоженная при выходе. Нигде вы не сохраните его нигде. Итак, почему вы ожидаете, что он волшебным образом появится в собственности клеток?

0

Для того, чтобы сделать то, что вы просите, вам нужно на самом деле хранить строковые значения в Cells собственности, а не создавать их динамически в OnDrawCell событие:

procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer; 
    Rect: TRect; State: TGridDrawState); 
var 
    Parametertext : string; 
begin 
    Parametertext := StringGrid1.Cells[ACol, ARow]; 
    StringGrid1.Brush.Color := clBtnFace; 
    StringGrid1.Font.Color := clWindowText; 
    StringGrid1.Canvas.FillRect(Rect); 
    DrawText(StringGrid1.Canvas.Handle, PChar(ParameterText), Length(ParameterText), Rect, DT_SINGLELINE); 
end; 

... 

StringGrid1.Cells[0, 0] := 'Test'; 
StringGrid1.Cells[1, 0] := 'Test1'; 

Если вы не собираетесь использовать Cells недвижимость для хранения строк вы можете использовать только TDrawGrid.

+0

thanks @Remy Lebeau .. Есть ли другой способ получить значение ячейки, которое генерируется функцией 'DrawText'? На самом деле я пытаюсь автоматизировать приложение Delphi с помощью Test Complete Tool. – bejarun

+0

@bejarun Если вы напрямую не нажимаете 'DrawText()' самостоятельно или не используете технологию OCR для чтения на экране, то нет. –

Смежные вопросы