Доброго времени суток....
//Warning!!! Предыстория будет большая.... =)
// Вопрос — в самом конце...
Пишу класс TMatrix для задуманной математической коллекции.(Delphi .NET)
Собственно проблем со всякими
class operator Add(a,b:TMatrix):TMatrix;
class operator LogicalNot(a:TMatrix):TMatrix;
нету...
НО! Дальше возникает естественная идея сделать поудобнее
class operator Explicit(a:TMatrix):TStringList;
class operator TMatrix.Explicit(a: TMatrix): TStringList;
Var i,j:integer;tmp:TStringList;s,pr:string;
begin
//****************преобразование Матрицы к типу TString*************************
// Переменные:
// i,j - цикл по строкам и столбцам
// tmp - временный экземпляр класса TStringList для хранения результата
// s - строка в которой формируется строка, добавляемая к конечному резльтату
// pr - строка, в которой будет сформирован формат точности вывода
//******************************************************************************
tmp:=TStringList.Create;tmp.Clear;
if a.Precision>0
then
begin
pr:='.';For i:=1 to a.Precision do pr:=pr+'0';
end
else pr:='';
if a.Precision=0 then pr:='0.';
tmp.Add('!MATRIX!');
for i := 0 to a.RowCount - 1 do
begin
s:=''#230;
for j := 0 to a.ColCount - 1 do
begin
s:=s+'['+a.values[i,j].ToString(pr)+'] ';
end;
tmp.Add(s);
end;
tmp.Add('~MATRIX~');
result:=tmp;
tmp.Free;
end;
Тут всё здорово: при вызове
RichEdit1.Lines.AddStrings(TStringList(varMatrix))
всё рисуется нормально.
Думаю: "Неплохо было бы скобки по бокам матрицы выводить".
Как нарисовать скобки? В шифрте Symbol есть символ #230, но весь текст рисовать Sysbol'ом — не очень хочется...
//Завязка кончилась — начались грабли
RichEdit умеет (УМЕЛ)
RichEdit1.SelAttributes.Name:='Symbol'
для выделенного участка текста делать...
// tmp.Add('!MATRIX!'); и было введено для индикации начала матрицы...
Ищу начало:
procedure TForm1.Button3Click(Sender: TObject);
var
fnd : integer;
begin
fnd := -1;
repeat
fnd := RichEdit1.FindText('!MATRIX!', fnd+1, Length(RichEdit1.Text), []);
if fnd > -1 then
begin
RichEdit1.SelStart := fnd;
RichEdit1.SelLength := Length('!MATRIX!');
RichEdit1.SelAttributes.Color := clRed;
end;
until fnd = -1;
end;
FindText возвращает -1 (то есть "нету такой строчки")
После такого пространнственного объяснения ситуации —
простейший вопрос "ПОЧЕМУ?"
И на засыпку:
SendMessage(RichEdit1.Handle, EM_FINDTEXT, WParam, LParam);
WParam — FR_DOWN — нету такой константы, ну да ладно — мелочи.
LParam — MSDN, говорит что lparam — pointer to FINDTEXT structure...
Var ft:FINDTEXT;
Begin
ft.lpstrText:='!MATRIX!';
ft.chrg.cpMin:=0;
ft.chrg.cpMax:=Length(RichEdit1.Text);
Это нормально, но, КАК передать в SendMessage указатель на ft???
То есть нужна функция
function PointerToInteger(var X:Pointer):Integer;
Это проблемы .NET(как таковой), непатченной BDS или моё незнание особенностей .NET?
//Сорри за рамер...

... << RSDN@Home 1.1.3 beta 2 >>