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

Вниз

строки....   Найти похожие ветки 

 
Steep   (2008-02-11 23:06) [0]

суть такая берем первый Memo (текст примерно такой):

Linkin Park, Era, Ария, Evanescence, Limp Bizkit, DMX, 50 Cent, Slipknot, Nightwish,
Rammstein, Enya, Papa Roach, Король и Шут, Blink 182, Apocaliptica, Benny Benassi,
Alizee, Nickelback, Nirvana, Powerman 5000, The Black Eyed Peace, Наив,
Cranberries, Moby, Ludacris, Tokia Hotel, Three Days Grace, Nelly Furtado, Metallica,
HIM, Prodigy, Brainstorm, Tiga, KoRn, Green Day, 666, Город 312, Roxette, Jay-Z, Rob
Zombie, Flipsyde, Justin Timberlake, Сплин, Дельфин, Timbaland, placebo, zdob si
zdub, Paul Van Dyk, all american rejects, Guano Apes, Lordi, Lost prophets, Rihanna,
Global Deejays, Die Apokalyptischen Reiter, Пилигрим, Легалайз, Morcheeba, Akon,
Pink, Bob Sinkler, Gregorian, The Killers, Fort Minor


потом ищем до запятой копируем в Memo2 вроде бы все работает
НО почемуто после некоторых названии в Memo2 появляются пустые строки...
например после: Nightwish, Benny Benassi, Наив, Metallica и тд.

код сканирование текста

procedure TForm1.Button1Click(Sender: TObject);
var
 AllText: string;
 x: boolean;
 tmp: string;
 tmppos: integer;
begin
 x := false;
 AllText := Memo1.Text;
 repeat
 tmppos := pos(", ", AllText);
 if tmppos<>0 then
   begin
       //Showmessage(AllText);
     tmp := copy(AllText, 1, tmppos-1 );
       //Showmessage("tmp: " + tmp);
     Memo2.Lines.Append( tmp );
     delete(AllText, 1, tmppos+1 );
       //Showmessage(AllText);
   end
 else x := true;
 until x
end;


как недопустить их появления? в чем может быть ошибка?


 
antonn ©   (2008-02-11 23:15) [1]

удаляй символы перевода строки #13#10 в Memo1.Text


 
Steep   (2008-02-11 23:20) [2]

хм... а как их искать и удалять?
ведь pos("#13", AllText) так точно не задаш... (точнее задаш но не найдет....)


 
{RASkov} ©   (2008-02-11 23:21) [3]

> [2] Steep   (11.02.08 23:20)

begin
x := false;
AllText := StringReplace(Memo1.Text, #13#10, "", [rfReplaceAll]);


 
antonn ©   (2008-02-11 23:21) [4]

pos(#13,"стриииинг")
а так? :)


 
Steep   (2008-02-11 23:24) [5]


> {RASkov} ©

круто... эх... как стать таким умным :)


> antonn ©  

хм просто и сердито... но вариант от {RASkov} мне понравился больше :) (хотя учту на будущее)


 
Игорь Шевченко ©   (2008-02-11 23:28) [6]

Лови:

unit main;

interface
uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls;

type
 TForm1 = class(TForm)
   Memo1: TMemo;
   Memo2: TMemo;
   Button1: TButton;
   procedure Button1Click(Sender: TObject);
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure StrBreakApart(const Source, Delimeter: string; Parts: TStrings);
var
 curPos: Integer;
 curStr: string;
begin
 Parts.Clear;
 if Length(Source) = 0 then
   Exit;
 Parts.BeginUpdate;
 try
   CurStr:= Source;
   repeat
     CurPos:= AnsiPos(Delimeter, CurStr);
     if CurPos > 0 then begin
       Parts.Add(Copy(CurStr, 1, Pred(CurPos)));
       CurStr:= Copy(CurStr, CurPos+Length(Delimeter),
         Length(CurStr)-CurPos-Length(Delimeter)+1);
     end else
       Parts.Add(CurStr);
   until CurPos=0;
 finally
   Parts.EndUpdate;
 end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
 S: TStrings;
begin
 S := TstringList.Create;
 try
   StrBreakApart(StringReplace(Memo1.Text, #13#10, "", [rfReplaceAll]), ", ",
     S);
   Memo2.Lines.Assign(S);
 finally
   S.Free;
 end;
end;

end.


 
Steep   (2008-02-11 23:29) [7]

я предполагал что там зарыты скрытые символы, но как их выловить я что-то не придумал...
хотел переводить строку на отдельные символы и смотреть что там...
токо вот как это делать не помню - искал как переводить строки в массив из char и искать небуквенные символы....


 
{RASkov} ©   (2008-02-11 23:32) [8]

Из [6]

> procedure TForm1.Button1Click(Sender: TObject);
> var
> S: TStrings;

Не нужен :)
StrBreakApart(StringReplace(Memo1.Text, #13#10, "", [rfReplaceAll]), ", ", Memo2.Lines);


 
{RASkov} ©   (2008-02-11 23:35) [9]

> [7] Steep   (11.02.08 23:29)
> искал как переводить строки в массив из char

Они уже) почти так... к каждому символу в String есть доступ по его индексу....

> и искать небуквенные символы....

Легко:
if Stroka[i]<>Буква then Символ с индексом i  в строке не буквенный....


 
Игорь Шевченко ©   (2008-02-11 23:36) [10]

{RASkov} ©   (11.02.08 23:32) [8]

Это домашнее задание автору.


 
antonn ©   (2008-02-11 23:38) [11]


> хм просто и сердито... но вариант от {RASkov} мне понравился
> больше :) (хотя учту на будущее)

мне сейчас лень проверять, а что будет если не #13#10, а #10#13? :)


 
Steep   (2008-02-11 23:41) [12]


> Игорь Шевченко ©

эээээ....
теперь я чувствую полный ламмером......

вот что поянл пишем процедуру
StrBreakApart(const Source, Delimeter: string; Parts: TStrings);
где
Source исходная строка
Delimeter то что удаляем
Parts -это то что возвращаем?

зачем нужны и что делают
Parts.BeginUpdate;
CurPos:= AnsiPos(Delimeter, CurStr); (это поиск строки в подстроке вроде но зачем этот ansi?)
Parts.Add(Copy(CurStr, 1, Pred(CurPos))) что такое Pred?
Parts.EndUpdate;


 
Anatoly Podgoretsky ©   (2008-02-11 23:43) [13]

> antonn  (11.02.2008 23:38:11)  [11]

Таких бить палкой


 
{RASkov} ©   (2008-02-11 23:44) [14]

> [12] Steep   (11.02.08 23:41)
> Delimeter то что удаляем

Это разделитель вообще-то)

> зачем нужны и что делают

Хм.... вот здесь

> теперь я чувствую полный ламмером......

ты прав :(
:)
Ничего нового Игорь не написал, все есть в F1 т.е. - хэлпе...


 
Игорь Шевченко ©   (2008-02-11 23:45) [15]

Steep   (11.02.08 23:41) [12]


> Source исходная строка
> Delimeter то что удаляем
> Parts -это то что возвращаем?


{
 Преобразование строки с разделителями в список строк.
 Параметры:
  Source    - исходная строка.
  Delimiter - строка-разделитель.
  Parts     - список строк, заполняемый функцией. Создается и уничтожается
              вызывающей функцией.
}

Parts.BeginUpdate - в случае, как предложил {RASkov} © это вызовет перерисовку Memo2 только один раз, а не на каждое изменение.


> CurPos:= AnsiPos(Delimeter, CurStr); (это поиск строки в
> подстроке вроде но зачем этот ansi?)
> Parts.Add(Copy(CurStr, 1, Pred(CurPos))) что такое Pred?
>


AnsiPos - та же самая Pos, но с учетом национальных букв.
Pred - открываем любой учебник по языку паскаль и начинаем вдумчиво читать. Узнаем, что это предыдущее значение от аргумента, а Succ - последующее.


 
Steep   (2008-02-11 23:58) [16]


> Это домашнее задание автору.

задание вроде понял =)
еще понял что все таки мы в процедуре сразу ищем ", " и кидаем слова в список который потом отдаем во второе мемо


> мне сейчас лень проверять, а что будет если не #13#10, а
> #10#13? :)

вроде после #13 (вроде ентер ) может идти #10 (символ каретки вроде как), а наоборот я не уверен


> Anatoly Podgoretsky ©

зачем так жестко?


> Это разделитель вообще-то)

угу понял...


> > теперь я чувствую полный ламмером......
> ты прав :(
>:)
>Ничего нового Игорь не написал, все есть в F1 т.е. - хэлпе...

угу я думаю я хоть что начал понимать в итоге чувствую что все что я знаю это ничто по сравнению с тем что есть.... чето как то и желание программировать отпадать начинает....
Насчет F1 есть... токо как узнать есть ли команды типа StringReplace(Memo1.Text, #13#10, "", [rfReplaceAll]);
с которыми бьешся бьешся а в итоге оказывается что это было....

я понимаю по справке можно посмотреть у известной команды параметры - и если не обчень понятно пример.... а как узнать что там вобще есть.....


 
antonn ©   (2008-02-11 23:59) [17]


> Anatoly Podgoretsky ©   (11.02.08 23:43) [13]
>
> > antonn  (11.02.2008 23:38:11)  [11]
>
> Таких бить палкой
>

нет, бить палкой тех программеров, которые не учли вольный ввод пользователя. Не имхо. Для мемо по-барабану как идет перенос строки и перевод каретки.


 
{RASkov} ©   (2008-02-12 00:02) [18]

> Steep

Кстати попробуй еще вот такой вариант:

procedure TForm1.Button2Click(Sender: TObject);
var AllText: string;
begin
 AllText := StringReplace(Memo1.Text, #13#10, "", [rfReplaceAll]);
 Memo2.Lines.Text := StringReplace(AllText, ", ", #13#10, [rfReplaceAll]);
end;


Может подойдет? :)


 
ketmar ©   (2008-02-12 00:03) [19]

>[17] antonn © (2008-02-11 23:59:00)
бить палкой тех идиотов, которые делают разделение строк как #10#13. эти символы пользователь точно не вводит руками. это только кривая софтина может такое родить. автора такой софтины кастрировать, и вывесить на фонарь — для вразумления остальных.

---
Understanding is not required. Only obedience.


 
Steep   (2008-02-12 00:04) [20]


> Игорь Шевченко ©

спасибо - хоть что то я начинаю понимать....


 
ketmar ©   (2008-02-12 00:04) [21]

интересно, почему никто не вспомнил про TStrings.CommaText?

---
Understanding is not required. Only obedience.


 
Steep   (2008-02-12 00:11) [22]


> Может подойдет? :)

ээээ.... что-то я понимаю что чем мудренее проблема тем решенее лучше если оно проще.....


 
Steep   (2008-02-12 00:21) [23]

теперь зародилась несколько другая проблема... при копировании, а затем вставки вместо русского текста нечитаемый набор символов...
нужно исползовать юникод? или можно както скопировать нормально?


 
Игорь Шевченко ©   (2008-02-12 00:26) [24]


> теперь зародилась несколько другая проблема... при копировании,
>  а затем вставки вместо русского текста нечитаемый набор
> символов...


Клавиатуру на русский переключи перед копированием :)


 
Johnmen ©   (2008-02-12 00:27) [25]

Зачем использовать аффигенно тормознутые ф-ии, если можно написать быстрый однопроходный код?
Типа этого:
const
 delim = ",";
 ignorechars : set of char =[ #13,#10,#32];

s:=Memo.Text;
len:=Length(s);

ibeg:=1; i:=ibeg;
while i<=len do begin;
 while (ibeg<=len) and ((s[ibeg] in ignorechars) or (s[ibeg]=delim)) do Inc(ibeg);
 i:=ibeg;
 while (i<=len) and (s[i]<>",") do Inc(i);
 iend:=i-1;
 while (iend>1) and (s[iend] in ignorechars) do Dec(iend);
 Memo.Lines.Add(Copy(s,ibeg,iend-ibeg+1));
 Inc(i);
 ibeg:=i;
 end;


 
Johnmen ©   (2008-02-12 00:28) [26]


> ketmar ©   (12.02.08 00:04) [21]
> интересно, почему никто не вспомнил про TStrings.CommaText?

Потому, что и пробел является неотменным разделителем.


 
Steep   (2008-02-12 00:34) [27]


> Зачем использовать аффигенно тормознутые ф-ии, если можно
> написать быстрый однопроходный код?

потомучто у меня не миллионы слов - а маленький код понять легче - ну если не понять то хотя бы меньше кода....


> Клавиатуру на русский переключи перед копированием :)

помогло... неужели програмно переключать чтобы работало наверняка?


 
Johnmen ©   (2008-02-12 00:36) [28]


> потомучто у меня не миллионы слов - а маленький код понять
> легче - ну если не понять то хотя бы меньше кода....

Если ты так реально считаешь, то ты не станешь программистом.
Да тебе, как я уже понял, и не надо...


 
ketmar ©   (2008-02-12 00:38) [29]

>[27] Steep (2008-02-12 00:34:00)
>неужели програмно переключать чтобы работало наверняка?

мегебаянЪ.

мне вот интересно, почему 99.9% вопрошающих про «кракозяблы в буфере обмена» никогда не задумываются, какое именно магическое действие совершает переключение раскладки, и как можно добиться того же, но раскладку не дёргать?

---
Understanding is not required. Only obedience.


 
ketmar ©   (2008-02-12 00:39) [30]

>[26] Johnmen © (2008-02-12 00:28:00)
хм. а, ну да. строки с пробелами кавычить надо. каюсь, забыл.

---
Understanding is not required. Only obedience.


 
Игорь Шевченко ©   (2008-02-12 00:45) [31]

ketmar ©   (12.02.08 00:38) [29]


> и как можно добиться того же, но раскладку не дёргать?


Научи, а ? Я на самом деле не знаю "как добиться того же", чтобы из любых Delphi-ских Editов по стандартным командам копирования добиться вставки в юникодные программы корректного русского текста. Я серьезно.


 
Steep   (2008-02-12 00:58) [32]

вот нашел....

procedure BufferToClipboard(Buffer: WideString);
var WideBuffer: WideString;
   BuffSize: Cardinal;
   Data: THandle;
   DataPtr: Pointer;
begin
 if Buffer <> "" then begin
   WideBuffer := Buffer;
   BuffSize := length(Buffer) * SizeOf(WideChar);
   Data := GlobalAlloc(GMEM_MOVEABLE+GMEM_DDESHARE+GMEM_ZEROINIT, BuffSize + 2);
   try
     DataPtr := GlobalLock(Data);
     try
       Move(PWideChar(WideBuffer)^, Pointer(Cardinal(DataPtr))^, BuffSize);
     finally
       GlobalUnlock(Data);
     end;
     Clipboard.SetAsHandle(CF_UNICODETEXT, Data);
   except
     GlobalFree(Data);
     raise;
   end;
 end;
end;


вызов процедуры
BufferToClipboard(" hello world");


 
Игорь Шевченко ©   (2008-02-12 01:02) [33]

Steep   (12.02.08 00:58) [32]

Это не то. Это я и сам умею. А мне надо, чтобы из любого Edit"а стандартным нажатием Ctrl+C в clipboard получался хороший русский текст.


 
Steep   (2008-02-12 01:05) [34]

unit файл

unit RusClipboard;

interface

uses Clipbrd;

type
 TRusClipboard = class(TClipboard)
private
 procedure SetCodePage(const CodePage: longint);
public
 procedure Open; override;
 procedure Close; override;
end;

implementation

uses Windows;

{ TRusClipboard }

procedure TRusClipboard.Close;
begin
 SetCodePage($0419);
 inherited;
end;

procedure TRusClipboard.Open;
begin
 inherited;
 SetCodePage($0419);
end;

procedure TRusClipboard.SetCodePage(const CodePage: longint);
var
 Data: THandle;
 DataPtr: Pointer;
begin
 // Назначить кодовую страницу для буфера обмена
 Data:= GlobalAlloc(GMEM_MOVEABLE + GMEM_DDESHARE, 4);
 try
   DataPtr := GlobalLock(Data);
   try
     Move(CodePage, DataPtr^, 4);
     SetClipboardData(CF_LOCALE, Data);
   finally
     GlobalUnlock(Data);
   end;
 except
   GlobalFree(Data);
 end;
end;

var
 FClipboard: TClipboard;
 OldClipboard: TClipboard;

initialization

 {Установить клипборд}
 FClipboard:= TRusClipboard.Create;
 OldClipboard:= SetClipboard(FClipboard);
 if OldClipboard <> nil then OldClipboard.Free;

end.


 
Steep   (2008-02-12 01:10) [35]


> Это не то. Это я и сам умею. А мне надо, чтобы из любого
> Edit"а стандартным нажатием Ctrl+C в clipboard получался
> хороший русский текст.

наверно как то обрабатывать нажатие клавиш...


 
Steep   (2008-02-12 01:23) [36]

типо

procedure TForm1.Memo1KeyDown(Sender: TObject; var Key: Word;
 Shift: TShiftState);
begin
if (Shift = [ssCtrl]) and (Key = ord("C")) then
 begin
   скопировать выделенный текст в буфер в нормальном виде :)))
 end;
end;


 
antonn ©   (2008-02-12 01:28) [37]


> ketmar ©   (12.02.08 00:03) [19]

[17] прочитай внимательно, запиши на бумажке и запомни.
пользователи, они такие, тянутся к тому продукту, который проще и надежней. и не бьет палкой. именно поэтому микрософт продает, зарабатывает и имеет бОльшую аудиторию, а ты сидишь в какой нибудь консоли и скрипишь зубами от зависти.
%)


 
Германн ©   (2008-02-12 01:31) [38]


> antonn ©   (12.02.08 01:28) [37]

Иногда лучше жевать.


 
antonn ©   (2008-02-12 01:32) [39]


> Германн ©   (12.02.08 01:31) [38]
>
>
> > antonn ©   (12.02.08 01:28) [37]
>
> Иногда лучше жевать.

Вот и я ему говорю.


 
ketmar ©   (2008-02-12 01:41) [40]

>[31] Игорь Шевченко © (2008-02-12 00:45:00)
тогда сначала научи, как добиться этого при помощи программного переключения раскладок. и чтобы юзер при сём не нервничал.


>[37] antonn © (2008-02-12 01:28:00)
я так рад, что ты обо мне много знаешь. можно, я тебе пожалуюсь? соседи постоянно в стену стучат: им мой скрип зубов по ночам спать мешает. я уже три вставных челюсти сточил, да…

я так полагаю, ты плевать хотел на m$, и денег у тебя больше, чем у них? я за тебя рад.
если не больше — не вякай глупости, а?

---
Understanding is not required. Only obedience.



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

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

Наверх




Память: 0.56 MB
Время: 0.063 c
15-1201714579
БарЛог
2008-01-30 20:36
2008.03.09
УПС своими руками


11-1184849522
max727
2007-07-19 16:52
2008.03.09
TCP в вопросах и ответах


2-1202658365
Kirill
2008-02-10 18:46
2008.03.09
Actions


15-1202116512
Dmitry S
2008-02-04 12:15
2008.03.09
Самый "дешевый" способ загрузить картинку PNG?


11-1166529914
2expres
2006-12-19 15:05
2008.03.09
Таймер на 10мс.





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский