Главная Новые темы Список тем Задать вопрос Поиск  

Форум "Delphi"


Паскаль, Делфи


 #0 bobi © 27.08.07 18:53:46 - 05.09.07 19:19:28

Как прочитать



как в delphi прочитать строку до пробела??? Цитата

 #1 Deep © 27.08.07 19:33:26

откуда? из файла/строки/...?
 #2 bobi © 27.08.07 21:43:12

строка:qqqqqqq wwwwwww ssssssss.

нужно прочитать qqqqqqq потом wwwwwww и потом ssssssss.
 #3 Deep © 28.08.07 03:08:23

unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}


procedure Str2StringList(const Value: string; var SL: TStringList);
var
  P, Start: PChar;
  S: string;
begin
  SL := TStringList.Create;
  try
    SL.Clear;
    P := Pointer(Value);
    if P <> nil then
      while P^ <>#0 do
      begin
        Start := P;
        while not (P^ in [#0,#32,#10,#13]) do Inc(P);
        SetString(S, Start, P - Start);
        SL.Add(S);
        if (P^ =#13) or (P^ =#10) or (P^ =#32) then Inc(P);
      end;
  finally
    //SL.Free;
    //освобождать класс нужно будет после использования его данных
  end;
end;



procedure TForm1.Button1Click(Sender: TObject);
var
  MyWords: TStringList;
  i: integer;
begin
  try
    Str2StringList('qqqqqqq wwwwwww ssssssss', MyWords);

    for i := 0 to MyWords.Count -1 do
     Application.MessageBox( PAnsiChar(MyWords[i]), 'Info', MB_OK);

  finally
    if Assigned(MyWords) then FreeAndNil(MyWords);
  end;
end;

end.

 #4 bobi © 28.08.07 12:02:13

не спасиб я уже сам нашел и по меньше

var s,x1,x2,x3:string;
begin
s:='qqqqqqq wwwwwww ssssssss';
x1:=copy(s,1,pos(' ',s)-1);
delete(s,1,pos(' ',s));
x2:=copy(s,1,pos(' ',s)-1);
delete(s,1,pos(' ',s));
x3:=s;
end;
 #5 Deep © 28.08.07 17:38:20

>#4   bobi ©
"поменьше" ? это еще спорный вопрос
мой пример работает с любым количеством слов, в строке могут быть символы перевода строк, результат помещается в удобный дальнейшего использования динамический массив...
извините, хотел как лучше    
 #6 bobi © 28.08.07 21:27:35

Да не спасибо конечно но "перевода строк" "динамический массив" для меня это непонятные слова а так просто и понятно.
 #7 Паша © 29.08.07 17:26:07

>#4 bobi  ©


а если там больше трех слов? а если пробелов нет вообще? у тебя толко частный случай показан. тут надо в цикле
wile pos(' ',s)>0 do

и т.д.
 #8 Deep © 29.08.07 19:54:31

>#6   bobi ©
а если несколько пробелов подряд, твой код сработает?
а возможно, и табуляцию надо учитывать?

ну, я так понял у тебя была в первую очередь синтаксическаю проблема - тебе нужно было знать функции, которые работают со строками. Теперь ты их знаешь, так что возможно стоит поискать в своем техзадании и алгоритмические проблемы -- на некоторые из них мы тебе с Пашей указали.
 #9 bobi © 29.08.07 20:17:12

Вообще-то эти строки генерирует прога,а прога не может поставить 3 пробела подряд    или 25 слов вместо 3
Не я согласен с вами что лучше использовать код deep`а но в моем случае лучше использовать этот:
var s,x1,x2,x3:string;
begin
s:='qqqqqqq wwwwwww ssssssss';
x1:=copy(s,1,pos(' ',s)-1);
delete(s,1,pos(' ',s));
x2:=copy(s,1,pos(' ',s)-1);
delete(s,1,pos(' ',s));
x3:=s;
end;
  
Deep`у и Паше респект

 #10 Юрий Федоров © 30.08.07 22:38:28

Есть еще такая штука, как Delimiter и DelimitedText

SL:=TStringList.Create;
try
  SL.Delpmiter:=' ';
  SL.DelpmitedText:='qqqqqqq wwwwwww ssssssss';
//После этого SL[0] = 'qqqqqqq'; SL[1] = 'wwwwwww', и так далее
finally
  SL.Free;
end;
 #11 Паша © 31.08.07 10:39:07

>#10 Юрий Федоров  ©

это в какой версии Дельфей? в пятерке, к примеру, еще такого нету. так шо ручками завсегда надежней. тем паче, ничего такого там военного нету.
 #12 Юрий Федоров © 31.08.07 10:56:53

>#11 Паша  ©  31.08.07 10:39:07


Фиг знает, в какой, по моему так уже 100 лет:-)
в семерке точно уже было
это в TStrings

впрочем, я там опечатался


    property Delimiter: Char;
    property DelimitedText: string;
 #13 Паша © 31.08.07 11:10:42

>#12 Юрий Федоров  ©

в пятерке еще нету. воть:

TStrings properties
Capacity
CommaText
Count
Names
Objects
Strings
StringsAdapter
Text
Values

собстна, я поиск по ВСЛ сделал на предмет наличия,- нэма.
 #14 Юрий Федоров © 01.09.07 09:01:51

>#13 Паша  ©  


А чего не переходишь на новые?
У меня D2007 - в целом доволен, куча новых примочек, в том числе расширения синтаксиса, которые реально помогают - хелперы для классов и записей, методы в записях, стрикт-секции, финализация классов и методов, перегрузка операторов, вложенные типы, поддержка нейм спесов в именах юнитов - это все очень хорошо улучшает жизнь программера :-)
 #15 Deep © 04.09.07 10:43:49

а какие требования у D2007 к железу? и как совместимость с компонентами под Делфи 7?

Ставил D2005 - не понравилось да и тормозит.
 #16 Паша © 04.09.07 10:57:06

>#14 Юрий Федоров  ©

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

а это шо за звери такие?
> методы в записях

> вложенные типы

можно маленький примерчик?
 #17 Zdvitas © 04.09.07 19:53:55

Юзайте PAscal =)) Read(s) Ыыы=))
 #18 Юрий Федоров © 04.09.07 19:54:56


Отмодерировал:
Deep
 #19 Юрий Федоров © 04.09.07 19:56:53


Deep
: дубль
 #20 Юрий Федоров © 04.09.07 20:05:37

>#15 Deep  ©  
> а какие требования у D2007 к железу?


Да по моему не особые) не задумывался на эту тему) НА 512 метрах оперативки работает более менее сносно
> Ставил D2005 - не понравилось да и тормозит.

2005 была очень неудачная и глючyая версия, после этого они исправились (в основном).

> и как совместимость с компонентами под Делфи 7?


Если компоненты с исходными кодами - то полная. Единственное что может потребоваться подправить - это если там встречаются директивы препроцессора с закладкой на версию -
{$IFDEF VER120}
{$ENDIF} - может понадобиться дописать новый IFDEF

>  #16 Паша  ©  


Метод в записях:
type
TMyRecord = record
  a: integer;
  b: Integer;
  function Summa: integer;
end;

function TMyRecord.Summa: Integer;
begin
Result:=a+b;
end;

можно еще переопределить операторы для записей, после чего станет доступно например
var
  R1, R2, R3: TMyRecord;
...
  R3:=R1+R2;

Вложенные типы
type
TMyClass = class
private type
  TMySubclass1 = class
  private
  ...
  public
  ...
  end;
public type
  TMySubclass2 = class
  ...
  end;
private
...
public
...
end;
Приватный вложенный тип виден только внутри класса-обертки
а паблик тип виден снаружи в виде
var
  X: TMyClass.TMySubclass2;

для чего нужно - для скрытия информации, и для группировки связанных между собой типов. Вложенными могут быть не только типы=классы ,но и простые типы, и константы

На всякий случай еще скажу на тему хелперов - они могут быть для классов и для записей
TStringsHelper = class helper for TStrings
public
  procedure DeleteEmptyStrings();
end;

после этого у всех объектов TStrings и их потомков добавляется этот метод
Memo1.Lines.DeleteEmptyStrings();

Написал хелпер для TRect - добавил BottomLeft, TopRight, Width, Height, методы Move, LpToDp и всякое такое. В общем, очень удобо
 #21 Юрий Федоров © 04.09.07 20:06:14

Чорт :-)
 #22 Deep © 04.09.07 21:00:36

>#21   Юрий Федоров ©
про хелперы первый раз слышу, но похоже действительно удобно
получается, что если для готового проекта в какую-то стандартную и часто использованную компоненту/класс надо добавить функциональность, то это можно сделать через хелпер...

при этом не плодятся наследники(обращение в коде идет к старому классу), ну и соответственно не надо ПРАВИТЬ УЖЕ НАПИСАННЫЙ КОД(те же объявления типа класса), только добавлять то что нужно.
 #23 Юрий Федоров © 05.09.07 09:51:40

>#22 Deep  ©  0

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

В принципе, метод хелпера - ровным счетом тоже самое, как просто процедура\функция, куда экземпляр класса передается параметром. (потому что данные в хелпер добавлять нельзя, только код)
Но так нагляднее получается, и удается хорошо сгруппировать схожие методы, которые сразу видны в выпадающем списке после точки:-)
 #24 Паша © 05.09.07 10:13:41

>#20 Юрий Федоров  ©

весьма занимательно... вероятно, надо срочно переходить на 2007

> var  R1, R2, R3: TMyRecord;...  

R3:=R1+R2;

в R3 складываются автоматом соответствуюшие поля записей R1 и R2? зобавно. щаз это все ручками надо делать, захекаешься. приходится писать классы, которые с этой мурой работают. морока
 #25 Юрий Федоров © 05.09.07 12:37:38

>  #24 Паша  ©  05.09.07 10:13:41
> в R3 складываются автоматом соответствуюшие поля записей
> R1 и R2?


Нет.
Ты можешь переопределить оператор "плюс" для каждого типа записей или классов
если ты его не переопределил, то эта конструкция не скомпилируется.

переопределяется так:

  TMyRecord = record
    X, Y: Float;
    class operator Add(const A, B: TMyRecord): TMyRecord;
  end;
....
class operator Add(const A, B: TMyRecord): TMyRecord;
begin
  Result.X:=A.X + B.X;
  Result.Y:=A.Y + B.Y;
end;

Вот список доступных операторов для переопределения:
Implicit  
Explicit  
Negative  
Positive  
Inc  
Dec  
LogicalNot  
BitwiseNot  
Trunc  
Round  
Equal  
NotEqual  
GreaterThan  
GreaterThanOrEqual  
LessThan  
LessThanOrEqual  
Add  
Subtract  
Multiply  
Divide  
IntDivide  
Modulus  
LeftShift  
RightShift  
LogicalAnd  
LogicalOr  
LogicalXor  
BitwiseAnd  
BitwiseOr  
BitwiseXor  
 #26 Mystic © 05.09.07 13:25:50

> при этом не плодятся наследники(обращение в коде идет к старому классу

Наследник сделать не всегда возможно. Попробуй, например, сделать наследника для TStrings, все равно TListBox.Items не будут знать о твоем наследнике ничего. Но я не могу сказать, что это так уж сильно критично: синтаксический сахар.

> Перегрузка операций

Тоже не могу сказать, что это очень полезная вещь. Имхо, в большинстве случаев, где возникает такая потребность, проще реализовать свой скриптовый язык, гораздо более заточеный под предметную область Сколько не перегружай операторы для матриц, но удобства MATLAB ты не получишь.
 #27 Юрий Федоров © 05.09.07 19:19:28

>#26 Mystic  ©
> Но я не могу сказать, что это так уж сильно критично: синтаксический
> сахар.


Главное, на мой взгляд, тут в двух моментах - группировке схожих методов вместе и наименовании метода. А правильное определение имен очень важно.
Если оформлять в виде отдельнойй процедуры, то в имени желательно будет упомянуть, к чему она собственно относится - к какому классу - ы виде префикса. или постфикса - что имхо снизит читабельность кода, и внесет некоторый элемент нелепицы


> Тоже не могу сказать, что это очень полезная вещь.


В некоторых случаях она полезна) Для сравнения записей, например
(для сравнения классов, имхо, использовать очень опасно, приведет к ошибкам)




  • Написать ответ

    Имя: Регистрация HTML?
    smiles смайлики
    Потом перейти в:    
    паутина



      ©  webest.net, 2002-2007  

    top.mail.ru
    » Бесплатный счетчик посещений
    » Рейтинг сайтов