Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2010.09.05;
Скачать: [xml.tar.bz2];

Вниз

Последний штришок в программу.   Найти похожие ветки 

 
Германн ©   (2010-06-12 02:18) [0]

В главном окне программы есть RichEdit, в который записывается "протокол" общения с внешним железом. Т.е. >"послано что-то", <" принято то-то".
Желательно всегда видеть самую нижнюю строку в этом RichEdit. Когда работа ведется из этого окна, то никаких проблем. SelStart и SetFocus дают результат. Но вот если при этом модально открыто (может модальность и ни при чём, не проверял) другое окно программы, то SelStart и SetFocus не срабатывают. Очевидно из-за того, что SetFocus не отрабатывает, что в общем понятно.
Так и вопрос. Как и что можно предпринять в данном случае?


 
turbouser ©   (2010-06-12 02:22) [1]

OnActivate для формы с ричедитом - в там SelStart и SetFocus


 
Германн ©   (2010-06-12 02:41) [2]


> turbouser ©   (12.06.10 02:22) [1]
>
> OnActivate для формы с ричедитом - в там SelStart и SetFocus

Ты не понял.
В окне главной формы (там где ричэдит) нажимается кнопка, по которой вызывается модально другая форма. В ней создаются и посылаются команды (запросы) к внешнему железу. И пока эту другую форму не закроешь первая (она же главная) не доступна в части SetFocus какому-то своему контроллу.

P.S. Этот ричэдит видим (хоть частично), но всегда видим. И это требование заказчика. И я его понимаю.


 
turbouser ©   (2010-06-12 02:44) [3]


> Германн ©   (12.06.10 02:41) [2]


> Ты не понял.
Ээммм.. то есть, надо пока отображается модальная форма, рисовать что-то на главной форме? А смысл?


 
Германн ©   (2010-06-12 03:02) [4]

На главной форме в RichEdit"е всегда ведётся лог. Сей лог порой весьма полезен для анализа.
Но и немало важно, чтоб сей лог можно было видеть (хоть частично) .
Те самые модальные формы - небольшие по размеру. Они закрывают только небольшую часть экрана.
Привычка у заказчика уже выработалась. Этой привычке пожалуй уже лет 10.
Не, если нет простых решений, то так тому и быть! Без вопросов.
Объяснить данному заказчику я смогу.


 
Eraser ©   (2010-06-12 03:11) [5]

RichEdit.SelStart := Length(RichEdit.Text);
или
RichEdit.SelStart := RichEdit.Perform(WM_GETTEXTLENGTH, 0, 0);
должно спасти.


 
Eraser ©   (2010-06-12 03:16) [6]

PS попробуйте в паре с выключенным hideselection.


 
Германн ©   (2010-06-12 03:42) [7]


> Eraser ©   (12.06.10 03:16) [6]

Попробую.
Спасибо, Лёха!


 
KilkennyCat ©   (2010-06-12 12:39) [8]

void RichTextAppend(char *cText)
{
   CHARRANGE   cr;

   cr.cpMin = -1;cr.cpMax = -1;
SendMessage(hChatLog,EM_EXSETSEL,0,(LPARAM)&cr);
SendMessage(hChatLog,EM_REPLACESEL, 0, (LPARAM)cText);
   SendMessage(hChatLog,WM_VSCROLL, /*SB_LINEDOWN*/ SB_BOTTOM, (LPARAM)NULL);
   return;
}

надено, грят, работает.


 
Германн ©   (2010-06-13 00:38) [9]


>  SendMessage(hChatLog,WM_VSCROLL, SB_BOTTOM,  (LPARAM)NULL);

Эта строчка помогла.Предыдущие мне не нужны.
Спасибо, Костя!


 
Германн ©   (2010-06-13 03:11) [10]

Теперь решил воплотить в жизнь свои старые идеи, ради которых выбрал для вывода лога RichEdit (ну не могу ничего не делать! А непосредственный заказчик в лучшем случае хоть как-то озаботится проверкой прошивки контроллера и программой тестирования только во вторник, в лучшем случае).
Алгоритм таков:
При посылке команды устанавливаю:
 RELog.SelStart:=Length(RELog.Text);
 RELog.SelAttributes.Color:=clBlack;
 RELog.Lines.Add(FormatDateTime("dd/mm/yy hh:nn:ss",Now)+">"+IntToHex(SEAddr.Value,2)+
IntToHex(StrToInt(ELength.Text),2)+St+Copy(ECRC.Text,1,Length(ECRC.Text)-1));
 RELog.SelStart:=Length(RELog.Text);
 RELog.SelAttributes.Color:=clRed;
 RELog.Lines.Add("<");

После получении "правильного" ответа
 if Answ = OK then begin
   RELog.SelStart:=Length(RELog.Text)-Length(St)-RELog.Lines.Count*2-1;
   RELog.SelLength:=Length(St)+2+RELog.Lines.Count*2;
   RELog.SelAttributes.Color:=clBlack;
 end;

но не работает сей код. То ли я не правильно задаю SelStsrt, то ли SelLength, то ли и то и другое.


 
_Юрий ©   (2010-06-13 11:22) [11]

а зачем именно РичЭдит для лога?
(я просто как то раз тоже решил так сделать, однако через некоторое время выяснилось, что идея нехороша, заменил на грид)


 
KilkennyCat ©   (2010-06-13 12:53) [12]

не работает как? цвет не меняет?
а правильный ответ меняет уже где-то там неправильный?


 
KilkennyCat ©   (2010-06-13 12:57) [13]

я вот лично полюбил нтмл...
простой listbox с поддержкой мини-html
вечером приду на работу, скину образец с компонентом.


 
KilkennyCat ©   (2010-06-13 16:00) [14]

//Поддержка мини-HTML,SelectionColor, SelectionFontColor, ShowFocusRect
//мини-HTML:
//, , <FONT color=>
//все теги должны иметь закрытие
//пример: Раздел A <FONT color="#CC0000">СЕЛЬСКОЕ ХОЗЯЙСТВО, ОХОТА И ЛЕСНОЕ ХОЗЯЙСТВО</FONT>

unit KimRobListBox;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, StdCtrls;

type
TKimRobListBox = class(TListBox)
private
  FSelectionColor: TColor;
  FSelectionFontColor: TColor;
  FShowFocusRect : Boolean;
  procedure SetSelectionColor(const Value: tcolor);
  procedure SetSelectionFontColor(const Value: tcolor);
  procedure SetShowFocusRect(const Value: Boolean);
  procedure CNDrawItem(var Message: TWMDrawItem); message CN_DRAWITEM;
protected
  procedure DrawItem(Index: Integer; Rect: TRect; State: TOwnerDrawState); override;
public
  constructor Create(AOwner:TComponent);Override;
  destructor Destroy;Override;
published
  property Style default lbOwnerDrawFixed;
  property SelectionColor: TColor read FSelectionColor write SetSelectionColor;
  property SelectionFontColor: TColor read FSelectionFontColor write SetSelectionFontColor;
  property ShowFocusRect: Boolean read FShowFocusRect write SetShowFocusRect;

end;

procedure Register;

implementation

constructor TKimRobListBox.Create(AOwner: TComponent);
begin
Inherited Create(AOwner);
Style := lbOwnerDrawFixed;
end;

procedure TKimRobListBox.SetSelectionColor(const Value: tcolor);
begin
 FSelectionColor := Value;
 Invalidate;
end;

procedure TKimRobListBox.SetShowFocusRect(const Value: Boolean);
begin
 FShowFocusRect := Value;
 Invalidate;
end;

procedure TKimRobListBox.SetSelectionFontColor(const Value: tcolor);
begin
 FSelectionFontColor := Value;
 Invalidate;
end;

procedure TKimRobListBox.DrawItem(Index: Integer; Rect: TRect; State: TOwnerDrawState);
type
 THTML = record
   color : TColor;
   style : TFontStyles;
   text : string;
 end;
var
 Data: String;

 function colorh(s : string) : TColor;
 begin
   s := "$00" + s[5] + s[6] + s[3] + s[4] + s[1] + s[2];
   if not IdentToColor(S, Longint(Result)) then Result := TColor(StrToIntDef(S, $1FFFFFFF));
 end;

 procedure DrawParserHTML(data : string);
 var
   i, l, ml, x : integer;
   tagS, text : string;
   DataHTML : array of THTML;
   Flags: Longint;
 begin
   Flags := DrawTextBiDiModeFlags(DT_SINGLELINE or DT_VCENTER or DT_NOPREFIX);
   i := 0;
   l := length(data);
   tagS := "";
   text := "";
   ml := 1;
   setlength(datahtml, ml);
   datahtml[ml - 1].color := clNone;
   datahtml[ml - 1].style := [];
   datahtml[ml - 1].text := "";
   repeat
     inc(i);
     if data[i] = "<" then begin
       tags := data[i];
       repeat
         inc(i);
         tagS := tags + data[i];
       until (data[i] = ">") or (i = l);
       inc(ml);
       setlength(datahtml, ml);
       if tags[2] = "/" then begin
         if "</FONT>" = tags then datahtml[ml - 1].color := clNone;
         if "" = tags then datahtml[ml - 1].style := [];
         if "
" = tags then datahtml[ml - 1].style := [];
       end else begin
         x := pos("<FONT color=", tagS);
         if x > 0 then datahtml[ml - 1].color := colorh(copy(tagS,x + 14, 6)) else datahtml[ml - 1].color := datahtml[ml - 2].color;
         if "" = tags then datahtml[ml - 1].style := [fsBold] else //datahtml[ml - 1].style := datahtml[ml - 2].style;
         if "" = tags then datahtml[ml - 1].style := [fsItalic] else datahtml[ml - 1].style := datahtml[ml - 2].style;
       end;
       datahtml[ml - 2].text := text;
       datahtml[ml - 1].text := "";
       text := "";
     end else text := text + data[i];
   until i = l;
   if ml = 1 then datahtml[ml - 1].text := text;
   for i := 0 to high(datahtml) do if datahtml[i].text <> "" then begin
     canvas.Font.Color := datahtml[i].color;
     canvas.Font.Style := datahtml[i].style;
     DrawText(Canvas.Handle, PChar(datahtml[i].text), Length(datahtml[i].text), Rect, Flags);
     rect.Left := rect.Left + canvas.TextWidth(datahtml[i].text);
   end;
   setlength(datahtml, 0);
 end;

begin
 begin
   Canvas.FillRect(Rect);
   if Index < Count then begin
     if not UseRightToLeftAlignment then Inc(Rect.Left, 2) else Dec(Rect.Right, 2);
     if (Style in [lbVirtual, lbVirtualOwnerDraw]) then Data := DoGetData(Index) else Data := Items[Index];
     DrawParserHTML(data);
   end;
 end;
end;

procedure TKimRobListBox.CNDrawItem(var Message: TWMDrawItem);
var
 State: TOwnerDrawState;
begin
 with Message.DrawItemStruct^ do begin
   State := TOwnerDrawState(LoWord(itemState));
   Canvas.Handle := hDC;
   Canvas.Font := Font;
   Canvas.Brush := Brush;
   if (Integer(itemID) >= 0) and (odSelected in State) then begin
     Canvas.Brush.Color := clRed;
     Canvas.Font.Color := clBlue;
   end;
   if Integer(itemID) >= 0 then DrawItem(itemID, rcItem, State) else Canvas.FillRect(rcItem);
   if (odFocused in State) and FShowFocusRect then DrawFocusRect(hDC, rcItem);
   Canvas.Handle := 0;
 end;
end;

destructor TKimRobListBox.Destroy;
begin
  Inherited;
end;

procedure Register;
begin
 RegisterComponents("KimRob", [TKimRobListBox]);
end;

end.


 
KilkennyCat ©   (2010-06-13 16:01) [15]

жуть какая...


 
Германн ©   (2010-06-13 20:38) [16]


> KilkennyCat ©   (13.06.10 12:53) [12]
>
> не работает как? цвет не меняет?

Меняет.Только то начало выделения куда-то съезжает, то конец.


 
Германн ©   (2010-06-13 20:39) [17]


> Юрий ©   (13.06.10 11:22) [11]
>
> а зачем именно РичЭдит для лога?

Только для выделения цветом ошибок обмена с железякой.


 
KilkennyCat ©   (2010-06-13 23:16) [18]

тогда не проще ли ListBox? Переписать DrawItem, ну можно добавить массив хранения "ошибок" и все. полчаса возни всего.


 
Германн ©   (2010-06-13 23:38) [19]


> KilkennyCat ©   (13.06.10 23:16) [18]
>
> тогда не проще ли ListBox?

У ричэдита есть встроенная запись в rtf-формате. Таким образом выделение сохраняется в файле, который можно просмотреть в любое время любым человеком.
Так и не понял как можно вычислить начало выделения зная RELog.Text. Такое впечатление, что при моих вычислениях есть какой-то неучтенный байт в каждой строке RELog.
Пошел другим путем.
   RELog.SelStart:=RELog.SelStart-Length(St);
   RELog.SelLength:=Length(St);

Заработало.



Страницы: 1 вся ветка

Форум: "Прочее";
Текущий архив: 2010.09.05;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.51 MB
Время: 0.004 c
15-1276193680
AKE
2010-06-10 22:14
2010.09.05
Я забыл можно ли объявлять функцию внутри функции?


15-1276254260
novichek
2010-06-11 15:04
2010.09.05
SQL Microsoft.Jet.OLEDB.4.0? Access


6-1226058064
Buckazoid
2008-11-07 14:41
2010.09.05
Права доступа пользователей домена


15-1276204135
AKE
2010-06-11 01:08
2010.09.05
Интерпретатор "текстового" Паскаля для мобильного...


15-1276369798
AKE
2010-06-12 23:09
2010.09.05
У кого-нибудь есть код создания...





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский