Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.06.2013, 00:06   #11
Алексей_2012
t45t
Участник клуба
 
Аватар для Алексей_2012
 
Регистрация: 20.03.2012
Сообщений: 1,849
По умолчанию

Все-таки сам сделал, но код большеват, кто сможет оптимизировать?
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  s, kto: string;
  i: word;
  b: array of string[1];
begin
  s := '';
  RichEdit1.clear;
  kto := Trim(Edit1.text);
  RichEdit1.Lines.Add('Ваш код: ' + kto);
  RichEdit1.Lines.Add(stringofchar('=', 30));
  SetLength(b, Length(kto));
  for i := 1 to Length(kto) do
  begin
    if i <= 3 then
    begin
      b[i - 1] := Copy(kto, i, 1);
      RichEdit1.lines.Add('B' + inttostr(i) + ' = A' + inttostr(i) + ' = ' + b[i - 1]);
    end
    else
    if (i <= 5) and (i >= 4) then
    begin
      if (kto[i] = '1') and (b[i - 4] = '1') or (kto[i] = '0') and (b[i - 4] = '0') then b[i - 1] := '0' else b[i - 1] := '1';
      RichEdit1.lines.Add('B' + inttostr(i) + ' = A' + inttostr(i) + ' xor B' + inttostr(i - 3) + ' = ' + kto[i] + ' xor ' + b[i - 4] + ' = ' + b[i - 1]);
    end
    else
    begin
      if (kto[i] = '1') and (b[i - 4] = '1') or (kto[i] = '0') and (b[i - 4] = '0') then b[i - 1] := '0' else b[i - 1] := '1';
      if (b[i - 1] = '1') and (b[i - 6] = '1') or (b[i - 1] = '0') and (b[i - 6] = '0') then b[i - 1] := '0' else b[i - 1] := '1';
      RichEdit1.lines.Add('B' + inttostr(i) + ' = A' + inttostr(i) + ' xor B' + inttostr(i - 3) + ' xor B' + inttostr(i - 5) + ' = ' + kto[i] + ' xor ' + b[i - 4] + ' xor ' + b[i - 6] + ' = ' + b[i - 1]);
    end;
    s := s + b[i - 1];
  end;
  RichEdit1.lines.Add(stringofchar('-', 60));
  RichEdit1.Lines.Add('Cкремблированный код: ' + s);
  b := nil;
end;

З.Ы. Еще надо в ричедит выделить символ b[i-1] любым цветом, пытался сам через selstart и SelLength-не вышло, просто не могу для selstart указать какую именно строчку, начиная с какой позиции подсвечивать
from dark to light)

Последний раз редактировалось Алексей_2012; 17.06.2013 в 00:39.
Алексей_2012 вне форума Ответить с цитированием
Старый 17.06.2013, 09:15   #12
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Вы так хотели?

Код:
....
    else
    begin
      if (kto[i] = '1') and (b[i - 4] = '1') or (kto[i] = '0') and (b[i - 4] = '0') then b[i - 1] := '0' else b[i - 1] := '1';
      if (b[i - 1] = '1') and (b[i - 6] = '1') or (b[i - 1] = '0') and (b[i - 6] = '0') then b[i - 1] := '0' else b[i - 1] := '1';
      RichEdit1.lines.Add('B' + inttostr(i) + ' = A' + inttostr(i) + ' xor B' + inttostr(i - 3) + ' xor B' + inttostr(i - 5) + ' = ' + kto[i] + ' xor ' + b[i - 4] + ' xor ' + b[i - 6] + ' = ' + b[i - 1]);
    end;
    s := s + b[i - 1];
  end;

  {выделим все B1 .. B8}
  RichEdit1.Lines.BeginUpdate;
  for i := 1 to 8 do begin
    s2 := 'B'+IntToStr(i);
    richedit1.selstart := richedit1.FindText(s2+' =',0, length(richedit1.text), []);
    richedit1.sellength := length(s2);
    richedit1.selattributes.color:=clRed;
    richedit1.selattributes.Style := [fsBold];
  end;
  RichEdit1.Lines.EndUpdate;



  RichEdit1.lines.Add(stringofchar('-', 60));
  RichEdit1.Lines.Add('Cкремблированный код: ' + s);
  b := nil;
end;
Serge_Bliznykov вне форума Ответить с цитированием
Старый 17.06.2013, 22:53   #13
Алексей_2012
t45t
Участник клуба
 
Аватар для Алексей_2012
 
Регистрация: 20.03.2012
Сообщений: 1,849
По умолчанию

не совсем, но все же, как я понял-надо сначала выделить в цикле то что нужно по-красить, и потом, там цикл не до 8 будет, а до length(kod)) если не трудно, то сделайте комменты для этого куска кода:

Код:
  RichEdit1.Lines.BeginUpdate;
  for i := 1 to 8 do begin
    s2 := 'B'+IntToStr(i);
    richedit1.selstart := richedit1.FindText(s2+' =',0, length(richedit1.text), []);
    richedit1.sellength := length(s2);
    richedit1.selattributes.color:=clRed;
    richedit1.selattributes.Style := [fsBold];
  end;
  RichEdit1.Lines.EndUpdate;
а именно меня интересует выделение любой из всех строчек текста в trichedit

Да, и еще, почему то работает не так подсветка синтаксиса, во вложениях код, и скрин того, что работает не так
Вложения
Тип файла: rar ошибки.rar (208.9 Кб, 9 просмотров)
from dark to light)

Последний раз редактировалось Алексей_2012; 17.06.2013 в 23:06.
Алексей_2012 вне форума Ответить с цитированием
Старый 18.06.2013, 13:32   #14
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

код работает ровно так, как ему и положено
Дело в том, что используемый мною код (кстати, я взял его на DelphiWorld - вот тут:
Как выделить в RichEdit 4 строки ) работает только если выделаемый текст УНИКАЛЕН (так работает метод FindText).
Если же текст, который мы хотим выделить НЕ уникален, то выделится только первое вхождение искомого слова (что мы и наблюдаем - B1 B2 .. B8 выделились только первые вхождения в тексте)

Возможно, что Вам удобнее будет воспользоваться другим способов - завести переменную, которая будет считать смещение в richEdit1 от начала текста (в символах, разумеется). Тогда, когда нам нужно будет что-то выделить - мы по этому смещению и задав длину и будем выделять. Это несложно.

что касается комментариев к вышеприведённому коду (если они ещё нужны ):
Цитата:
Код:
  RichEdit1.Lines.BeginUpdate; // выключили эранное обновление RichEdit1 (для скорости)
  for i := 1 to 8 do begin // цикл по выделяемым словам от 1 до 8
    s2 := 'B'+IntToStr(i); // искомое слово равно Bx,  где x - это число 

      // методом FindText найдём требуемое слово + пробел + знак (например,
     // для i=1 будем искать текст B1 = 
     // найденную позицию (кстати, мы не проверяем, нашлось что-либо или нет - считаем, что такой текст есть обязательно, поэтому нашлось! )
     // присваиваем переменной selstart - это начало "выделения" в RichEdit
    richedit1.selstart := richedit1.FindText(s2+' =',0, length(richedit1.text), []);
             
    richedit1.sellength := length(s2); // длина "выделения" в RichEdit равна длине строки Bx,  где x - это число
    richedit1.selattributes.color:=clRed; // выделенный текст покрасили красным
    richedit1.selattributes.Style := [fsBold]; // и сделали его ПОЛУЖИРЫМ (Болдом)
  end; // конец цикла
  RichEdit1.Lines.EndUpdate; // закончили изменение RichEdit1 - отобразили изменения
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Скремблер GIZ Помощь студентам 2 26.04.2012 18:38
Почему так работает? Hall Общие вопросы C/C++ 15 26.01.2012 00:02
че такое скремблер Kukurudza Общие вопросы C/C++ 1 06.09.2011 13:49
LookupField работает да не так BooZzz_hs БД в Delphi 0 20.05.2010 17:38
не работает, что-то не так. Анжелика Помощь студентам 2 06.12.2008 21:47