Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > как обрезать текст в мемо?


Автор: treem 21.3.2009, 20:21
как обрезать текст в мемо?  smile 

вообщем объясню кратко что мне нужно, короче я получаю заголовки последних тем на форуме...
вот например:
Новые ключи для антивируса Касперского
Управление процессорным временем на Паблике.
Microsoft показала мобильное будущее 2019 года
Мошенник получил по заслугам!
Защита аккаунта по IP.
ОБНОВЛЕНИЯ от 18.03.2009

всё это я получаю в мемо...

результат нужен примерно такой
Новые ключи для антиви...
Управление процессорным...
Microsoft показала мобильн...
Мошенник получил по засл...
Защита аккаунта по IP.
ОБНОВЛЕНИЯ от 18.03.200...


алгоритм примерно такой, если текст больше 23 символов то удалять всё кроме первых 23 символов и добавть ...

вообщем я ламер, и нихрена не могу сделать...  smile 

please help  smile 

 smile 

Автор: THandle 21.3.2009, 20:27

 ! 
THandle
Меньше эмоций в названии темы, пожалуйста



treem, бежишь в цикле по всем строчкам(Lines), проверяешь - если длина больше 23(length), то удаляешь с помощью delete ненужную часть и прибавляешь к строке '...'.

Автор: treem 21.3.2009, 20:37
Цитата(THandle @ 21.3.2009,  20:27)
treem, бежишь в цикле по всем строчкам(Lines), проверяешь - если длина больше 23(length), то удаляешь с помощью delete ненужную часть и прибавляешь к строке '...'.

в том то и дело, что я незнаю как это сделать... я имею введу код...

Добавлено через 5 минут и 49 секунд
 smile  smile   smile 

Автор: Данкинг 21.3.2009, 21:17
Цитата(treem @  21.3.2009,  20:37 Найти цитируемый пост)
незнаю как это сделать

С помощью функций COPY или DELETE. А уж как пройтись по строчкам Memo - примеров масса. Впрочем, если 
Цитата(treem @  21.3.2009,  20:21 Найти цитируемый пост)
вообщем я ламер, и нихрена не могу сделать... 

 - тогда, думаю, тебе ничего не поможет. smile 
 smile 
ЗЫ: в русском языке нет слова "вообщем", а "не" с глаголами пишется слитно только в чешском.

Автор: Christoph 21.3.2009, 23:33
Держи код, немного нестандартный
Код

var
  Str:String[20];
  i:Integer;
  NewStrList:TStringList;
begin
  NewStrList:=TStringList.Create;
   for i:=0 to Memo1.Lines.Count-1 do
     begin
       if length(Memo1.Lines[i])>23 then
         begin
           Str:=Memo1.Lines[i];
           NewStrList.Add(Str+'...');
         end
       else
         NewStrList.Add(Memo1.Lines[i]);
     end;
 Memo1.Lines.Assign(NewStrList);
end;


Автор: Matematik 22.3.2009, 00:06
treem, 


Код

function CopyStrMax_(const AStr:String; AMax:Integer):String;
begin
  if Length(AStr)>AMax then
  begin
    Result := Copy(Astr, 1, AMax-3) + '...';
  end
    else
  begin
    Result := AStr
  end
end;

procedure CopyStringsMax_(const AStrings:TStrings; AMax:Integer);
var j:Integer;
begin
  for j:=0 to AStrings.Count-1 do
    AStrings[j] := CopyStrMax_(AStrings[j], AMax);
end;

procedure CopyStringsMax2_(const AInStrings,AOutStrings:TStrings; AMax:Integer);
var j:Integer;
begin
  for j:=0 to AInStrings.Count-1 do
    AOutStrings.Add(CopyStrMax_(AInStrings[j], AMax))
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  {обрезать в другой список}
  CopyStringsMax2_(Memo1.Lines, Memo2.Lines, 23);
  {в том же}
  CopyStringsMax_(Memo1.Lines, 23)
end;



Автор: Dmi3ev 22.3.2009, 00:27
А че так все трудно?
А вот так
Код

procedure TForm1.Button1Click(Sender: TObject);
var
  i: Integer;
begin
  for i:=0 to Memo1.Lines.Count-1 do
    if (length(Memo1.Lines[i])>23) then
      begin
        Memo1.Lines[i]:=LeftStr(Memo1.Lines[i], 23)+'...';
      end;
end;
end.

Это моя первая программа на Delphi, но вроде работает...  smile 

Автор: Данкинг 22.3.2009, 00:30
Dmi3ev, можно даже ещё на 2 строчки сократить:

Код

procedure TForm1.Button1Click(Sender: TObject);
var
  i: Integer;
begin
  for i:=0 to Memo1.Lines.Count-1 do
    if (length(Memo1.Lines[i])>23) then
       Memo1.Lines[i]:=LeftStr(Memo1.Lines[i], 23)+'...';
end;
end.

 smile  smile 

Автор: Dmi3ev 22.3.2009, 00:37
Цитата

Dmi3ev, можно даже ещё на 2 строчки сократить:

это да... я их для себя поставил... не суть важно...
я про сам способ... так просто проще всего по-моему...

Автор: Данкинг 22.3.2009, 00:50
И ещё - для всех способов - я бы всё же брал Trim(Memo1.Lines[i]).

Автор: Dmi3ev 22.3.2009, 01:06
 smile 
Данкинг, спорить не буду, хотя мог бы, ведь у меня за плечами уже порядка 5 строк кода на Delphi  smile А это тебе не в тапки...  smile 

Автор: Данкинг 22.3.2009, 01:17
Цитата(Dmi3ev @  22.3.2009,  01:06 Найти цитируемый пост)
Данкинг, спорить не буду, хотя мог бы, ведь у меня за плечами уже порядка 5 строк кода на Delphi 

Так дело не конкретно в Delphi, у меня просто такая привычка (думаю, не очень плохая) - в строках обрезать пробелы:
Код

zaprosIB->ParamByName("adr1")->Value=StringReplace(Trim(zapros->FieldByName("addr")->AsString),(char)34,"$",TReplaceFlags());

 smile  smile smile

Автор: Dmi3ev 22.3.2009, 01:33
Цитата

Так дело не конкретно в Delphi, у меня просто такая привычка (думаю, не очень плохая) - в строках обрезать пробелы:

Может и неплохая, ты придерживаешься теории:
"психология пользователя такова, что он ставит пробел в начале и в конце строки..." 
Мне что-то такое из книжки по Access вспоминается...  (да и в принципе по любым БД)
Вопрос был в другом, поэтому это здесь непринципиально... 
Я стал более уверенным, осознав, что 5 строк кода - это не так уж и мало...  smile  

Теперь буду более тверд и настойчив, а по сему:
1) не надо тут никакого Trim!
2) использовать только тот код, который я выложил!
3) слушать только меня, я все таки ни одну строчку кода написал на старом добром Дельфине (а пять)  smile  

Автор: Данкинг 22.3.2009, 01:56
Цитата(Dmi3ev @  22.3.2009,  01:33 Найти цитируемый пост)
Вопрос был в другом, поэтому это здесь непринципиально... 

Здесь - возможно. smile Но я такой теории придерживаюсь потому, что много кодил (да и кодю smile ) на FoxPro, а там как раз без ALLTRIM никуда. smile 

Цитата(Dmi3ev @  22.3.2009,  01:33 Найти цитируемый пост)
2) использовать только тот код, который я выложил!

Честно говоря, я даже не подумал, что можно так просто и это будет работать (Memo1.Lines[i]:=...), я думал, что придётся запоминать текущую позицию строки, удалять, а затем вставлять новую на прежнюю позицию. smile 

Автор: Dmi3ev 22.3.2009, 03:09
Цитата

Честно говоря, я даже не подумал, что можно так просто и это будет работать (Memo1.Lines[i]:=...), я думал, что придётся запоминать текущую позицию строки, удалять, а затем вставлять новую на прежнюю позицию.

Век живи - век учись...  smile  

Автор: treem 22.3.2009, 09:13
спасиба вам всем  smile  smile  smile  smile     вы мне очень помогли  smile 

Автор: THandle 22.3.2009, 09:16
treem, в следующий раз обращайтесь в http://forum.vingrad.ru/forum/Vingrad-help-center.html. Этот раздел не предназначен для просьб сделать все за себя. 

Вообще грустно. На простые вопросы идут целой толпой отвечать, а как сложные... Печально.

Тему закрываю. Опасаюсь дальнейших ненужных обсуждений.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)