Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Разбиение строки  (Прочитано 6778 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Элексир
Помогающий

ru
Offline Offline
Пол: Мужской

« : 24-08-2008 08:54 » 

Здравствуйте. такая проблема.
Код:
var
...
fam,imya,otch:string;
i,k,j,j2:integer;
begin
...
i:=length(edit1.Text);
while edit1.Text[i]<>' ' do i:=i-1;
j:=i;
otch:=Copy(edit1.Text,j+1,length(edit1.Text));

k:=1;
while edit1.Text[k]<>' ' do k:=k+1;
j2:=k;
fam:=copy(Edit1.Text,1,j2-1);
imya:=copy(Edit1.Text,j2+1,length(edit1.Text)-(length(otc)+1));
в результате всех махинаций в базе должно быть фамилия имя отчество (по своим столбам разумеется)
у меня же получается
Фамилия (Иванов) Имя (Иван Иван..) Отчество (Иванович). помогите!
можно было бы конечно использовать три эдита для каждого.
« Последнее редактирование: 24-08-2008 08:56 от Элексир » Записан
zubr
Модератор

by
Offline Offline
Пол: Мужской

« Ответ #1 : 24-08-2008 12:24 » 

Код:
procedure ParsFamImOtch(const FIO: string; var fam, im, otch: string);
type
  TFamImOtch = (fam_, im_, otch_);

var
  s: string;
  k, i: Integer;
  FamImOtch: TFamImOtch;
begin
 s := Trim(FIO);
 FamImOtch := fam_;
 fam:='';
 im:='';
 otch:='';
 For i:=1 to 3 do
 begin
  k := Pos(' ', s);
  Case FamImOtch of
   fam_: begin
    If k<>0 then
    fam := Copy(s, 1, k-1)
    else
    begin
      fam := Trim(s);
      break;
    end;
   end;
   im_: begin
    If k<>0 then
    im := Copy(s, 1, k-1)
    else
    begin
      im := Trim(s);
      break;
    end;
   end;
   otch_: begin
    If k<>0 then
    otch := Copy(s, 1, k-1)
    else
    begin
      otch := Trim(s);
      break;
    end;
   end;
  end;
  Delete(s, 1, k);
  s := Trim(s);
  inc(FamImOtch);
 end;
end;
Записан
Basurman
Опытный

ru
Offline Offline
Пол: Мужской

« Ответ #2 : 24-08-2008 12:52 » 

Да ладно издеваться над человеком.
Пусть посмотрит на последнюю строку своего кода и прикинет каким образом посчитать количество символов для копирования. Там ведь явное не то, не в смысле очепятки "otc" вместо "otch" - а в смысле, что он про фамилию забыл.
Записан
Элексир
Помогающий

ru
Offline Offline
Пол: Мужской

« Ответ #3 : 24-08-2008 15:40 » 

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

Basurman, а зачем этой строке нужна длина фамилии? я же убрал ее из границы указав
Цитата
copy(Edit1.Text,j2+1
а потом у меня пошли проблемы с длиной копирования. которую я пытался решить разными методами.
вначале у меня там стоял j-1 но и так почему то тоже не проехала.


А вобще я уже решил эту проблемку с использованием функции delete за что спасибо Zubr'у
Записан
zubr
Модератор

by
Offline Offline
Пол: Мужской

« Ответ #4 : 24-08-2008 15:55 » 

Элексир, в структуре модуля Delphi есть секция interface и implementation. Так вот чтобы в любом месте секции implementation твоя функция была видна, ее прототип надо объявить в секции interface:
Код:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

procedure ParsFamImOtch(const FIO: string; var fam, im, otch: string);

implementation

{$R *.dfm}

procedure ParsFamImOtch(const FIO: string; var fam, im, otch: string);
begin
...............
end;

end.
З.Ы. Стоило бы почитать учебник.
Записан
Basurman
Опытный

ru
Offline Offline
Пол: Мужской

« Ответ #5 : 24-08-2008 18:17 » 

"copy(Edit1.Text,j2+1" - это откуда начинать копирование.
А то, что после - подсчёт длины копирования.
И если из длины текста вычесть длину отчества, получится длина фамилии + длина имени. Вот и копируется имя + часть отчества, хорошо хоть фамилия короткая.
Записан
Элексир
Помогающий

ru
Offline Offline
Пол: Мужской

« Ответ #6 : 24-08-2008 18:43 » 

Basurmanспасибо за науку, теперь буду знать!
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines