Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по Delphi (все версии) - часть 3

Модерирует : ShIvADeSt

ShIvADeSt (07-04-2008 02:27): продолжение в http://forum.ru-board.com/topic.cgi?forum=33&topic=9383  Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101

   

Frodo_Torbins

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Тогда наверно так: Form1.Icon.Handle := LoadIcon(hInstance, 'ICONNAME'). А вообще рекомендую www.drkb.ru

Всего записей: 2319 | Зарегистр. 24-05-2007 | Отправлено: 22:05 26-03-2008
Antananarivu

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Да... видимо, мой вопрос так и останется без ответа..

Всего записей: 151 | Зарегистр. 10-10-2006 | Отправлено: 22:20 26-03-2008
Sampron

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Frodo_Torbins
Спасибо за помощь и за ссылку!

Всего записей: 563 | Зарегистр. 06-01-2007 | Отправлено: 01:32 27-03-2008
SergeBS



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Antananarivu
1. Проверяй названия файлов на недопустимые символы - их немного.
2. У почтовых ящиков обычно есть ограничение на максимальный размер письма.  Письмо и прикрепленный файл идут одним куском. У халявных он 1 - 5 - 10 Мб. У меня - 100 Мб .

Всего записей: 272 | Зарегистр. 19-04-2005 | Отправлено: 08:14 27-03-2008
Antananarivu

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
1. Проверяй названия файлов на недопустимые символы - их немного.  
Проверять, то можно, нет проблем, но ведь понятно, что что-то не так работает на самом деле, не может же быть такого, что стандартная функция не работает с теми файлами у которых в названии символ подчеркивания.

Всего записей: 151 | Зарегистр. 10-10-2006 | Отправлено: 08:43 27-03-2008
SergeBS



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Antananarivu

Цитата:
Memo1.Lines.SaveToFile(addr+inttostr(mailcicl)+'.txt');  

В addr вполне могут быть недопустимые символы. И ничего не мешает то же подчеркивание заменить. Но ты его не найдешь - это ты ВИДИШЬ подчеркивание.

Всего записей: 272 | Зарегистр. 19-04-2005 | Отправлено: 10:14 27-03-2008
Antananarivu

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
С подчеркиванием разобрался, написал перекодировочку небольшую.  
Теперь такой вопрос... вот пришло письмо, вот есть объект IdMessage, мне нужно прочитать его тело. Тело иногда приходит в кодировке koi8-R иногда win и т.д. Написал процедурку перекодировки KoiToWin... НО!
Как мне определить в какой кодировке пришло ко мне письмо? Нашел что есть свойство CharSet объекта IdMessage, которое определяет кодировку, но опять же оно при перессылке туда письма почему-то остается пустым...
Может, кто поможет?
 
Добавлено:
Другими словами, как узнать в какой кодировке лежит текст письма на почтовом ящике?

Всего записей: 151 | Зарегистр. 10-10-2006 | Отправлено: 11:06 27-03-2008
SergeBS



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Antananarivu
Есть готовые алгоритмы распознавания кодировки - ищи на torry или где еще

Всего записей: 272 | Зарегистр. 19-04-2005 | Отправлено: 12:10 27-03-2008
Antananarivu

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Готовые алгоритмы пока оставим, тем более насколько я слышал они громоздкие и все равно не дают 100% гарантии верного распознавания (если я ошибаюсь, поправьте).
Я пока о другом:
Нашел поле в письме: Content-Type.
Если письмо не содержит вложения оно может быть таким:
Content-Type: text/plain; charset=Windows-1251
или таким:
Content-Type: text/plain; charset=koi8-R  
- тут проблем нет, анализирую и понимаю в какой кодировке текст.
Но если письмо содержит вложение, то это поле выглядит так:
Content-Type: multipart/mixed;boundary="----NurywzQy-hKJjY2EbN5IJu6VL:1206609564".
Вопрос: означает ли это, что в данном случае информация о кодировке текста в письме отсутствует? Или я просто в данном случае не умею ее вытаскивать?
Заранее спасибо!  

Всего записей: 151 | Зарегистр. 10-10-2006 | Отправлено: 12:28 27-03-2008
Jokerjar79



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Antananarivu,  

Код:
Content-Type: multipart/mixed

означает, что письмо состоит из нескольких блоков, каждый из которых, в свою очередь, имеет свой Content-Type
 
Сохрани меня в 1.mht
 

Всего записей: 710 | Зарегистр. 08-09-2007 | Отправлено: 12:57 27-03-2008
Antananarivu

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Спасибо, то есть надо устроить перебор частей письма и если встретится текстовое проверить его кодировку? То есть насколько я понимаю это будет что-то типа:
Idmessage.MessageParts.Items[i].ContentType
Верно?
 
Если я прав, то программка муторная получается... проверить все возможные ContentType а их подтипов очень много, проверить все блоки письма и если в каком-то из них найдется кодировка charset = koi8-R перевести ее в win.  
А более простого пути не вижу...

Всего записей: 151 | Зарегистр. 10-10-2006 | Отправлено: 13:05 27-03-2008 | Исправлено: Antananarivu, 13:15 27-03-2008
SZap



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Уважаемые, помогите пожалуйста автоматизировать задачу, а то люди тратят на нее массу времени выполняя все в ручную и допускают ошибки:
Исходные данные: результат SQL запроса в три поля (Товар, Поставщик, Цена) и тысячи строк. В большинстве случаев (более 50%), Цены на Товары у разных Поставщиков (Групп поставщиков) одинаковые, иногда, у некоторых поставщиков нет каких нибудь товаров.
Задача: Необходимо сгенерировать HTML таблицу с Ценами, в которой бы кол-во строк соответствовало кол-ву эксклюзивных Товаров из запроса (+строка заголовка), а кол-во столбцов, не кол-ву Поставщиков, а кол-ву Групп Поставщиков, у которых Цена на все Товары одинаковая (или отсутствует). При этом, заголовками к этим столбцам должно быть перечисление Поставщиков, входящих в эту группу.
А может это вообще можно реализовать в виде SQL запроса? К сожалению, я не большой специалист.(
Заранее, большое спасибо!

Всего записей: 145 | Зарегистр. 19-11-2003 | Отправлено: 23:34 27-03-2008
greenpc

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Нужна помощь.
XMPP/Jabber - передать русский текст
в ipworks - не получается

Всего записей: 401 | Зарегистр. 18-04-2003 | Отправлено: 09:10 28-03-2008
Antananarivu

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Это еще раз я. Все работает, скачивает почту с сервера. Но иногда с каким то письмом возникает ошибки типа 'Loding table entry not found' или 'Invalid argument to date encode'. Читал форумы, нашел где-то, что нужно обновить Indy.  
Не спрашиваю, о том, так ли это (слишком узкая проблема), но помогите пожалуйста переустановить Indy. Опять же нашел на форуме дистрибутив последней версии, так же нашел то, что для Delphi 6 нужно сначала 'удалить старую версию Indy, а потом установить новую'.
Понимаю, что вопрос глупый, но можно по шагам? Как и где его из дельфи удалять и куда его потом из дистрибутива устанавливать?
Заранее большое спасибо!

Всего записей: 151 | Зарегистр. 10-10-2006 | Отправлено: 14:03 28-03-2008
NOwlar



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Если мне не изменят память:
Как удалить Indy из Delphi 6 по шагам:
1. Закрыть Delphi, если открыта
2. Удалить из каталога $(DELPHI)\Bin файлики indy60.*
3. Удалить из каталога $(DELPHI)\Lib файлики Id*.dcu
3. Удалить из каталога $(DELPHI)\Lib\Debug файлики Id*.dcu
 
По-моему это всё, что нужно сделать. А дистрибутив новой версии Indy должен установить всё в нужное место сам - это моё предположение, ибо я устанавливал Indy из исходников.

Всего записей: 170 | Зарегистр. 25-01-2006 | Отправлено: 15:18 30-03-2008
greenpc

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Antananarivu
продолжу ответ NOwlar
_http://indyproject.org/Sockets/Docs/Indy10Installation.EN.aspx

Всего записей: 401 | Зарегистр. 18-04-2003 | Отправлено: 12:00 31-03-2008
NOwlar



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Можно ещё попробовать автоматический инстоллер. Вроде написано, что для community он free of charge.
_http://www.atozed.com/indy/plus/installVCL.ru.aspx
 
Естественно, что компоненты лучше устанавливать из исходников, ссылка выше приведена как возожно более простой вариант установки. Я не пробовал так устанавливать, поэтому заявить что оно всё работает не могу.

Всего записей: 170 | Зарегистр. 25-01-2006 | Отправлено: 12:33 31-03-2008 | Исправлено: NOwlar, 12:36 31-03-2008
Antananarivu

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Короче говоря, вроде как переустановил Indy, но проблема не исчезла...  
Программа считывает почту с сервера, 150 сообщений могут пройти нормально, без сбоев и вдруг.. ошибка "Асcess violation at address.....".
При этом текст программы в общем-то стандартный... да и те письма, которые приводят к ошибке, ничем особенным не выделяются.  

Код:
 
unit Unit222;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, IdMessage, IdBaseComponent, IdComponent,
  IdTCPConnection, IdTCPClient, IdMessageClient, IdPOP3, IdHeaderCoder;
 
const
  cod='=?ISO-8859-1?';
  koi=';';
  win='';
  base64_tbl: array[0..63] of Char = (
    'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H',
    'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P',
    'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X',
    'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f',
    'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n',
    'o', 'p', 'q', 'r', 's', 't', 'u', 'v',
    'w', 'x', 'y', 'z', '0', '1', '2', '3',
    '4', '5', '6', '7', '8', '9', '+', '/');
 
type
  TForm1 = class(TForm)
    Button1: TButton;
    POP3: TIdPOP3;
    IdMessage: TIdMessage;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
    function MailDeCode(Value: string): string;
    function KoiToWin(Value: string): string;
 
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
  intIndex: integer;
  attach: TIdAttachment;
implementation
 
{$R *.dfm}
 
procedure TForm1.Button1Click(Sender: TObject);
label f;
var
   mailcicl: integer;  
   partstr: integer;
   s: string;
   addr: string;  
   FN: string;
   koi: boolean;
   tt:integer;
begin
   POP3.Host:='pop.mail.ru';  
   POP3.Port:=110;  
   POP3.UserID:='antananarivu83@mail.ru';  
   POP3.Password:='**';  
   addr:=ExtractFilePath(Application.ExeName)+'bol\';
    POP3.Connect;  
    tt:=POP3.CheckMessages;
   for mailcicl:=1 to tt do  
   begin
        if POP3.CheckMessages<1 then goto f;  
        IdMessage.Clear; ;
        Memo1.Clear;  
        IdMessage.NoDecode:=false;
        POP3.Retrieve(mailcicl,IdMessage);  
        for intIndex := 0 to IdMessage.MessageParts.Count-1 do
        begin
                if IdMessage.MessageParts.Items[intIndex].ClassType=TIdattachment then
                begin
                            FN:= TIdAttachment(IdMessage.MessageParts.Items[intIndex]).Filename;
                            FN:=MailDeCode(FN);
                            FN:=AnsiUpperCase(FN);
                            Attach := IdMessage.MessageParts.Items[intIndex] as  TIdAttachment ;
                            Attach.SaveToFile(addr+FN);
 
//                        TIdAttachment(IdMessage.MessageParts.Items[intIndex]).SaveToFile(
//                        TIdAttachment(Idmessage.MessageParts.Items[intIndex]).Filename);
//                        TIdAttachment.Create(Idmessage.MessageParts,
//                        TIdAttachment(Idmessage.MessageParts.Items[intIndex]).Filename)
                end;
 
                if IdMessage.MessageParts.Items[intIndex].ClassType=TidText then
                begin
                        For PartStr:=0 to TIdText(IdMessage.MessageParts.Items[IntIndex]).Body.Count-1 do
                        begin
                                        s:=TIdText(IdMessage.MessageParts.Items[intIndex]).Body.Strings[PartStr];
                                        if (IdMessage.ContentType='text/plain; charset=koi8-r') then s:=KoiToWin(s);
                                        if Pos('multipart', LowerCase(IdMessage.ContentType)) > 0 then
                                        begin
                                                if IdMessage.MessageParts.Items[intIndex].ContentType='text/plain; charset=koi8-r' then s:=KoiToWin(s);
                                        end;
                                memo1.Lines.Add(s);
                        end;
                        Memo1.Lines.SaveToFile(addr+inttostr(mailcicl)+'.txt');  
                end;
 
        end;
// POP3.Delete(mailcicl);
   end;
   Attach.Free;
   f:  
   POP3.Disconnect;  
end;
 
end;
 
function TForm1.MailDeCode(Value: String): string;
var q:integer;
    l:integer;
    koi:boolean;
begin
//
   if (Pos('=?KOI8-R', UpperCase(value)) > 0) or (Pos('=?WIN', UpperCase(value)) > 0)then
   begin
        IdMessage.CharSet:='KOI8-R';
        q:=0;
        koi:=(Pos('=?KOI8-R', UpperCase(value)) > 0);
        while q<2 do
        begin
                l:=pos('?',value);
                delete(value,1,l);
                inc(q);
        end;
        value := cod + Value;
        result:=DecodeHeader(value);
        While pos(#0,result)>0 do
   // result:=AnsiReplaceStr(result,#0,'');
                delete(result,pos(#0,result),1);
 
        if koi then result:= KoiToWin(result);
   end
   else
   result:=value;
end;
 
function TForm1.KoiToWin(Value: string): String;
var L, I, Q:integer;
    s:string;
    chkoi, chwin :char;
    Lkoi:integer;
    conv:boolean;
begin
   s:='';
   Lkoi:=length(koi);
   L:=length(value);
   for I:=1 to L do
   begin
        chkoi:=value[I];
        q:=1;
        conv:=false;
        while (not conv) and (q<=lkoi) do
        begin
                chwin:=win[q];
                conv:= (chkoi = chwin);
                if not conv then
                        inc(Q);
        end;
        if q<=lkoi then
                s:=s+koi[q]
        else
                s:=s+chkoi;
    end;
  value:=s;
  result:=Value;
end;
 
end.
 

С чем это может быть связано? При этом ошибка возникает в момент разбора заголовка в процессе выполнения функции POP3.Retrieve(mailcicl,IdMessage);  может кто-нибудь сталкивался?
 
Добавлено:
При этом ошибка возникает в этой стандартной процедуре Indy  

Код:
 
function TIdHeaderList.GetValueFromLine(ALine: Integer): string;
var
  Name: string;
begin
  if ALine >= 0 then
  begin
    Name := GetNameFromLine(ALine);
    Result := Copy(Get(ALine), Length(Name) + 2, MaxInt);
    if FUnfoldLines then
    begin
      Inc(ALine);
      while (ALine < Count) and ((Length(Get(ALine)) > 0) and
        (Get(ALine)[1] in LWS)) do
      begin
        if (Result[Length(Result)] in LWS) then
        begin
          Result := Result + TrimLeft(Get(ALine))
        end
        else
        begin
          Result := Result + ' ' + TrimLeft(Get(ALine))
        end;
        inc(ALine);
      end;
    end;
  end
  else
  begin
    Result := '';
  end;
  Result := TrimLeft(Result);
end;

Вот в этой строке: if (Result[Length(Result)] in LWS) then
 
Добавлено:
Притом даже если доводить программу до самого банального и оставить только:

Код:
begin
   POP3.Host:='pop.mail.ru';    
   POP3.Port:=110;    
   POP3.UserID:='antananarivu83@mail.ru';  
   POP3.Password:='**';  
   POP3.Connect;  
   POP3.Retrieve(1,IdMessage);  
   POP3.Disconnect;  
end;

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

Код:
Subject:
 =?windows-1251?B?yuvo5e3y8ero6SDn4Org5yC5IE3H6i0wNDE3MiDu8iAyNy4wMy4wOA==?=

То есть ни с того ни с сего, в поле 'Subject:' почему то сначала идет символ конца строки и только на следующей строчке нужная информация...
Что посоветуете? Как правильнее выйти из этой ситуации? Никто не сталкивался?

Всего записей: 151 | Зарегистр. 10-10-2006 | Отправлено: 14:33 31-03-2008 | Исправлено: Antananarivu, 14:38 31-03-2008
anfilat

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Antananarivu

Цитата:
То есть ни с того ни с сего, в поле 'Subject:' почему то сначала идет символ конца строки и только на следующей строчке нужная информация...  

Вообщето стандарты читать иногда полезно. Например rfc822 пункт 3.1.1. Строчка эта совершенно корректная

Всего записей: 845 | Зарегистр. 12-08-2005 | Отправлено: 09:36 01-04-2008
Antananarivu

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
anfilat
тогда что не так со стандартной функцией разбора заголовка? почему программа вылетает?
 
Добавлено:
И кстати, почитал я стандарт, там вроде как описывается ситуация, что символ конца строки может стоять где-то посередине (разрывая строку), но о том чтобы он стоял прям первым символом, там такого нет, может в этом дело?
Ну вылетает ведь программа при попытке выполнить:

Код:
 
POP3.Retrieve(1,IdMessage);  

и вылетает именно на тех письмах у кототых в поле subject символ конца строки стоит первым...

Всего записей: 151 | Зарегистр. 10-10-2006 | Отправлено: 12:18 01-04-2008
   

Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по Delphi (все версии) - часть 3
ShIvADeSt (07-04-2008 02:27): продолжение в http://forum.ru-board.com/topic.cgi?forum=33&topic=9383


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru