D2006 .NET RichEdit.FindText, SendMessage, PointerToInteger
От: maslan Россия  
Дата: 06.09.06 19:41
Оценка:
Доброго времени суток....
//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 >>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.