Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Вопросы по Delphi (все версии) - часть 3

Автор: ymg2000
Дата сообщения: 26.03.2008 08:26
DmitryKz
Есть хороший сайт с неплохой подборкой компьютерной, в т.ч. дельфийской литературой:
http://www.wmate.ru/ebooks/
Посмотри, может там и дискета есть.
Автор: Antananarivu
Дата сообщения: 26.03.2008 08:53
Figaro2000
Так я ее скачал, там про pop3 только то, что это ущербный протокол и никаких примеров, разве не так?
Автор: RostY
Дата сообщения: 26.03.2008 09:35
Evill
вариант 1. RX library -- там есть компонент Gif-аниматор
вариант 2. GifImage.pas из http://www.tolderlund.eu/delphi/ или http://melander.dk/delphi/gifimage/
Автор: akaGM
Дата сообщения: 26.03.2008 09:47
Evill
вариант 0.
использовать родной класс TGIFImage, сорсы лежат в %delphi%\source\TGIFImage\
GIFImg.pas
Автор: DmitryKz
Дата сообщения: 26.03.2008 10:39
akaGM

Цитата:
а ещё сунься на сайт издательства, может там есть...

Йес! Все гениальное просто!
Автор: Antananarivu
Дата сообщения: 26.03.2008 12:54

Код:
nit Unit222;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, IdMessage, IdBaseComponent, IdComponent,
IdTCPConnection, IdTCPClient, IdMessageClient, IdPOP3;

type
TForm1 = class(TForm)
Button1: TButton;
POP3: TIdPOP3;
IdMessage: TIdMessage;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
intIndex:integer;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
label f;
var
mailcicl:integer;
partstr:integer;
s:string;
addr:string;
begin
POP3.Host:='pop.mail.ru';
POP3.Port:=110;
POP3.UserID:='antananarivu83@mail.ru';
POP3.Password:='******';
addr:=ExtractFilePath(Application.ExeName);
POP3.Connect;
for mailcicl:=1 to POP3.CheckMessages do
begin
if POP3.CheckMessages<1 then goto f ;
IdMessage.Clear;
Memo1.Clear;
POP3.Retrieve(mailcicl,IdMessage);
for intIndex := 0 to IdMessage.MessageParts.Count-1 do
begin
if IdMessage.MessageParts.Items[intIndex].ClassType=TIdattachment then
begin
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];
memo1.Lines.Add(s);
end;
Memo1.Lines.SaveToFile(addr+inttostr(mailcicl)+'.txt');
end;

end;
POP3.Delete(mailcicl);
end;

f:
POP3.Disconnect;

end;
end.
Автор: Evill
Дата сообщения: 26.03.2008 18:19
RostY
akaGM
Спасибо
Автор: Sampron
Дата сообщения: 26.03.2008 21:27
Подскажите как можно загрузить в заголовок окна другую иконку из ресурса?
К примеру ресурс с иконками:
MAINICON //иконка приложения
NEWICON //а это должна быть иконка заголовка
Автор: Frodo_Torbins
Дата сообщения: 26.03.2008 21:45
Sampron
Если в дизайнтайме, то через Project>Options...>Application>Load Icon. Либо в инспекторе объектов Form1>Icon>...
Автор: Sampron
Дата сообщения: 26.03.2008 21:59
Frodo_Torbins
Если через инспектор объектов то иконка записывается в ресурс TForm1 двоичными данными, а нужно загрузить её из ресурсов иконок.
Автор: Frodo_Torbins
Дата сообщения: 26.03.2008 22:05
Тогда наверно так: Form1.Icon.Handle := LoadIcon(hInstance, 'ICONNAME'). А вообще рекомендую www.drkb.ru
Автор: Antananarivu
Дата сообщения: 26.03.2008 22:20
Да... видимо, мой вопрос так и останется без ответа..
Автор: Sampron
Дата сообщения: 27.03.2008 01:32
Frodo_Torbins
Спасибо за помощь и за ссылку!
Автор: SergeBS
Дата сообщения: 27.03.2008 08:14
Antananarivu
1. Проверяй названия файлов на недопустимые символы - их немного.
2. У почтовых ящиков обычно есть ограничение на максимальный размер письма. Письмо и прикрепленный файл идут одним куском. У халявных он 1 - 5 - 10 Мб. У меня - 100 Мб .
Автор: Antananarivu
Дата сообщения: 27.03.2008 08:43
1. Проверяй названия файлов на недопустимые символы - их немного.
Проверять, то можно, нет проблем, но ведь понятно, что что-то не так работает на самом деле, не может же быть такого, что стандартная функция не работает с теми файлами у которых в названии символ подчеркивания.
Автор: SergeBS
Дата сообщения: 27.03.2008 10:14
Antananarivu

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

В addr вполне могут быть недопустимые символы. И ничего не мешает то же подчеркивание заменить. Но ты его не найдешь - это ты ВИДИШЬ подчеркивание.
Автор: Antananarivu
Дата сообщения: 27.03.2008 11:06
С подчеркиванием разобрался, написал перекодировочку небольшую.
Теперь такой вопрос... вот пришло письмо, вот есть объект IdMessage, мне нужно прочитать его тело. Тело иногда приходит в кодировке koi8-R иногда win и т.д. Написал процедурку перекодировки KoiToWin... НО!
Как мне определить в какой кодировке пришло ко мне письмо? Нашел что есть свойство CharSet объекта IdMessage, которое определяет кодировку, но опять же оно при перессылке туда письма почему-то остается пустым...
Может, кто поможет?

Добавлено:
Другими словами, как узнать в какой кодировке лежит текст письма на почтовом ящике?
Автор: SergeBS
Дата сообщения: 27.03.2008 12:10
Antananarivu
Есть готовые алгоритмы распознавания кодировки - ищи на torry или где еще
Автор: Antananarivu
Дата сообщения: 27.03.2008 12:28
Готовые алгоритмы пока оставим, тем более насколько я слышал они громоздкие и все равно не дают 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".
Вопрос: означает ли это, что в данном случае информация о кодировке текста в письме отсутствует? Или я просто в данном случае не умею ее вытаскивать?
Заранее спасибо!
Автор: Jokerjar79
Дата сообщения: 27.03.2008 12:57
Antananarivu,

Код: Content-Type: multipart/mixed
Автор: Antananarivu
Дата сообщения: 27.03.2008 13:05
Спасибо, то есть надо устроить перебор частей письма и если встретится текстовое проверить его кодировку? То есть насколько я понимаю это будет что-то типа:
Idmessage.MessageParts.Items[i].ContentType
Верно?

Если я прав, то программка муторная получается... проверить все возможные ContentType а их подтипов очень много, проверить все блоки письма и если в каком-то из них найдется кодировка charset = koi8-R перевести ее в win.
А более простого пути не вижу...
Автор: SZap
Дата сообщения: 27.03.2008 23:34
Уважаемые, помогите пожалуйста автоматизировать задачу, а то люди тратят на нее массу времени выполняя все в ручную и допускают ошибки:
Исходные данные: результат SQL запроса в три поля (Товар, Поставщик, Цена) и тысячи строк. В большинстве случаев (более 50%), Цены на Товары у разных Поставщиков (Групп поставщиков) одинаковые, иногда, у некоторых поставщиков нет каких нибудь товаров.
Задача: Необходимо сгенерировать HTML таблицу с Ценами, в которой бы кол-во строк соответствовало кол-ву эксклюзивных Товаров из запроса (+строка заголовка), а кол-во столбцов, не кол-ву Поставщиков, а кол-ву Групп Поставщиков, у которых Цена на все Товары одинаковая (или отсутствует). При этом, заголовками к этим столбцам должно быть перечисление Поставщиков, входящих в эту группу.
А может это вообще можно реализовать в виде SQL запроса? К сожалению, я не большой специалист.(
Заранее, большое спасибо!
Автор: greenpc
Дата сообщения: 28.03.2008 09:10
Нужна помощь.
XMPP/Jabber - передать русский текст
в ipworks - не получается
Автор: Antananarivu
Дата сообщения: 28.03.2008 14:03
Это еще раз я. Все работает, скачивает почту с сервера. Но иногда с каким то письмом возникает ошибки типа 'Loding table entry not found' или 'Invalid argument to date encode'. Читал форумы, нашел где-то, что нужно обновить Indy.
Не спрашиваю, о том, так ли это (слишком узкая проблема), но помогите пожалуйста переустановить Indy. Опять же нашел на форуме дистрибутив последней версии, так же нашел то, что для Delphi 6 нужно сначала 'удалить старую версию Indy, а потом установить новую'.
Понимаю, что вопрос глупый, но можно по шагам? Как и где его из дельфи удалять и куда его потом из дистрибутива устанавливать?
Заранее большое спасибо!
Автор: NOwlar
Дата сообщения: 30.03.2008 14:18
Если мне не изменят память:
Как удалить Indy из Delphi 6 по шагам:
1. Закрыть Delphi, если открыта
2. Удалить из каталога $(DELPHI)\Bin файлики indy60.*
3. Удалить из каталога $(DELPHI)\Lib файлики Id*.dcu
3. Удалить из каталога $(DELPHI)\Lib\Debug файлики Id*.dcu

По-моему это всё, что нужно сделать. А дистрибутив новой версии Indy должен установить всё в нужное место сам - это моё предположение, ибо я устанавливал Indy из исходников.
Автор: greenpc
Дата сообщения: 31.03.2008 11:00
Antananarivu
продолжу ответ NOwlar
_http://indyproject.org/Sockets/Docs/Indy10Installation.EN.aspx
Автор: NOwlar
Дата сообщения: 31.03.2008 11:33
Можно ещё попробовать автоматический инстоллер. Вроде написано, что для community он free of charge.
_http://www.atozed.com/indy/plus/installVCL.ru.aspx

Естественно, что компоненты лучше устанавливать из исходников, ссылка выше приведена как возожно более простой вариант установки. Я не пробовал так устанавливать, поэтому заявить что оно всё работает не могу.
Автор: Antananarivu
Дата сообщения: 31.03.2008 13:33
Короче говоря, вроде как переустановил 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.
Автор: anfilat
Дата сообщения: 01.04.2008 08:36
Antananarivu

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

Вообщето стандарты читать иногда полезно. Например rfc822 пункт 3.1.1. Строчка эта совершенно корректная
Автор: Antananarivu
Дата сообщения: 01.04.2008 11:18
anfilat
тогда что не так со стандартной функцией разбора заголовка? почему программа вылетает?

Добавлено:
И кстати, почитал я стандарт, там вроде как описывается ситуация, что символ конца строки может стоять где-то посередине (разрывая строку), но о том чтобы он стоял прям первым символом, там такого нет, может в этом дело?
Ну вылетает ведь программа при попытке выполнить:

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

Страницы: 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667

Предыдущая тема: 1С: Конвертация данных 2.0


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.