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

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

Автор: mcdie
Дата сообщения: 16.11.2010 09:31
SIgor33
Есть некоторые ресурсы (типа шрифтов, анимированных курсоров), которые не могут использоваться из памяти. Мы обязательно должны сохранить эти ресурсы во временном файле на диске и загружать их оттуда.
http://demi-s.narod.ru/resources/002.html

Можно попробовать в примере, конечно, заменить сохранение в файл на TStream, но думаю что не получится.
Автор: Man_Without_Face
Дата сообщения: 17.11.2010 16:06
Подскажите как записать record'ы в файл (может у кого-нибудь есть наглядный пример):
Есть заголовок файла:
THeader = record
cTransForm: char;
wFormVersion: WORD;
bAlgCRC: BYTE;
dwCreateEmit: DWORD;
.......................................
end;

И сами записи:
TRecords = record
wRecId: WORD;
dwDocDate: DATETIME;
bReservoir: BYTE;
.......................................
end;
Автор: Frodo_Torbins
Дата сообщения: 17.11.2010 16:47
Man_Without_Face
Рекорды должны быть упакованы, то есть packed, иначе разные версии вашей проги скомпилированные с разными настройками не смогут найти общий язык. Ну а далее либо типизированные файлы, либо TStream.Read/Write.
И еще Char на AnsiChar замените.
Автор: akaGM
Дата сообщения: 17.11.2010 16:48
Man_Without_Face

Цитата:
Есть заголовок файла:

и что?

рекорды можно писать по кр. мере тремя способами:
1. отдельно каждое поле каждого рекорда writeln'ом в текстовый файл
f: Text;
r: TRecords;
...
assign(f, 'filename.ext');
rewrite(f);
with r do begin
writeln(f, wRecId);
writeln(f, dwDocDate);
writeln(f, bReservoir);
...
end;
close(f);
...

2. в "файл записей"
f: File of TRecords;
r: TRecords;
...
assign(f, 'filename.ext');
rewrite(f);
write(f, r)
close(f);
...

3. в "нетипизированный файл"
f: file;
h: THeader;
r: TRecords;
...
assign(f, 'filename.ext');
rewrite(f, 1);
blockwrite(f, h, sizeof(h)); // header
blockwrite(f, r, sizeof(r)); // record
close(f);
...

слабо в учебнике посмотреть?
Автор: Man_Without_Face
Дата сообщения: 17.11.2010 16:53
Frodo_Torbins

Цитата:
разные версии вашей проги

Загружать файл будет вообще другая прога...

Цитата:
типизированные файлы

А можно наглядный пример...

Цитата:
либо TStream.Read/Write.

Access violation вызывает следующий код:
var AStream: TMemoryStream;
Header: tHeader;
................................................
Header.wFormVersion := 2;
AStream.Write(Header, SizeOf(THeader));
AStream.Position := 0;
AStream.SaveToFile('D:\SD.641');

Спасибо...






Добавлено:
akaGM
Спасибо, завтра попробую.

Цитата:
слабо в учебнике посмотреть?

В нете нашел через stream - не работает.
Автор: akaGM
Дата сообщения: 17.11.2010 17:05
Man_Without_Face

Цитата:
В нете нашел через stream - не работает

в сети надо искать принципы (как и в учебнике), а не готовые решения...
Автор: Frodo_Torbins
Дата сообщения: 17.11.2010 17:08
Man_Without_Face
Типизированные файлы - это вариант номер 2 по классификации akaGM. Что касается вашего кода, то я в нем не вижу создания объекта AStream. Должно быть хотя бы так:

Код: AStream := TMemoryStream.Create;
try
Header.wFormVersion := 2;
AStream.Write(Header, SizeOf(THeader));
AStream.Position := 0;
AStream.SaveToFile('D:\SD.641');
finally
AStream.Free;
end;
Автор: mcdie
Дата сообщения: 18.11.2010 15:05
Как реализовать следующий алгоритм:
Необходимо по названию Формы.Название компоненты.Название свойства известрых нами в текстовом виде изменить это свойство на нужное значение.
допустим:
по сохраненному тексту 'Form1.Edit1.Text' изменить свойство Text на другое значение.

Код: Procedure MyProc('Form1.Edit1.Text',Value);
begin
... ??? ...
end;
Автор: Frodo_Torbins
Дата сообщения: 18.11.2010 15:11
mcdie
Погуглите на RTTI. Правда в делфи до 2010-й работать можно только со свойствами в секции published.
Автор: Man_Without_Face
Дата сообщения: 18.11.2010 16:27
Подскажите как сделать запись в массивы типа Byte и Char из Tquery:
BYTE bCardNumber[19]
Char cTransForm[10]
........................................
TRecords = record
bCardNumber: array[0..18] of byte;
cTransForm: char[0..9] of char;
end;
..........................................
Такое вызывает ошибку несовместимости типов:
for i := 1 to length(qLoyalty.FieldByName('rc_loyalty_CardNumber').Asstring) do begin
R.bCardNumber[i - 1] := qLoyalty.FieldByName('rc_loyalty_CardNumber').Asstring;
end;
Что не так делаю (Delphi 2006)? Спасибо.
Автор: Frodo_Torbins
Дата сообщения: 18.11.2010 17:05
Man_Without_Face
Видимо "qLoyalty.FieldByName('rc_loyalty_CardNumber').Asstring" у вас является строкой, а "R.bCardNumber[i - 1]" - число, вот и несовместимость. Судя по вашему коду вам надо сделать: "bCardNumber: array[0..18] of AnsiChar;". Тогда весь ваш цикл сможете заменить на простое присваивание: "R.bCardNumber := qLoyalty.FieldByName('rc_loyalty_CardNumber').Asstring;".
Автор: Man_Without_Face
Дата сообщения: 19.11.2010 08:04
Frodo_Torbins
В рекорде должны быть только такие поля:
BYTE bCardNumber[19]
Char cTransForm[10]
Автор: ShIvADeSt
Дата сообщения: 19.11.2010 08:34

Цитата:
Такое вызывает ошибку несовместимости типов:

Код:
for i := 1 to length(qLoyalty.FieldByName('rc_loyalty_CardNumber').Asstring) do begin
R.bCardNumber[i - 1] := qLoyalty.FieldByName('rc_loyalty_CardNumber').Asstring;
end;

Автор: Man_Without_Face
Дата сообщения: 19.11.2010 09:18
Frodo_Torbins
ShIvADeSt
Спасибо, вроде что то получилось...,
только так сделал R.bCardNumber[i - 1] := s[i];
Автор: ShIvADeSt
Дата сообщения: 19.11.2010 10:06
Man_Without_Face

Цитата:
только так сделал R.bCardNumber[i - 1] := s[i];

У меня Дельфи 5, в ней такой фокус не пройдет Поэтому использую StrToInt
Автор: Frodo_Torbins
Дата сообщения: 19.11.2010 10:31
Man_Without_Face
Я так подозреваю, что вам нужна совместимость на бинарном уровне. Так вот можете посмотреть под отладчиком - будет точно тоже самое, а работать с таким типом будет проще.
Автор: MedvedevDM
Дата сообщения: 19.11.2010 13:51
Подскажите плиз
пример кода
для отправки почтового сообщения
используя SMTP 25 порт

без Outlook api напрямую,
возможно ли такое?
Автор: mcdie
Дата сообщения: 19.11.2010 15:22
MedvedevDM
В D5 можно попробовать использовать компоненты TNMSMTP,

в D6 и дальше компонентами Indy.

можно примеры глянуть:
http://www.delphisources.ru/pages/faq/base/send_email_using_mapi.html
http://www.delphisources.ru/pages/faq/base/send_email.html
http://www.delphisources.ru/pages/faq/base/send_email2.html
Автор: gur gur
Дата сообщения: 20.11.2010 12:11
Здравствуйте. Я делаю пошагово программу решения системы уравнений методом интерполяции - экстраполяции в Delphi, и на одном шаге застрял.
1. ввести коэффициенты матрици An,n и столбец свободных членов Bn
2. задать интервал интерполяции h и относительную погрешность e
3. выполнить ввод первоначальных значений Xn, x[i]:=1,2,...,n.
4. x[i]:=w[i]
5.Привести систему к виду f[i]:=0, где x[i]:=w[i];
на этом - 5 шаге я застрял. Как привести систему к виду f[i]:=0, где x[i]:=w[i]?
    
Автор: serg3001
Дата сообщения: 20.11.2010 17:51
Уважаемые программисты, прошу оказать помощь в решении следующей задачи, очень нужна помощь.

Есть три DBF файла:

accounts.dbf
rectranc.dbf
rectranh.dbf

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

Приведу подробный пример с описанием задачи:

из файла accounts.dbf извлекаются следующие данные:

TNUM   INOUT        ENDSUM
Б00043        АВБ         1000.000
Б00313        АВВ         1000.000
Б00354        Б2         3335.220


из файла rectranc.dbf:

CODE        TNUM        NAME             NFACC
127        Б00043        Иванов Иван Иванович     42307810312487525410
046        Б00313        Петров Петр Петрович     42358796510477456321
111        Б00354        Сидоров Сидор Сидорович   42325895448752223655


из файла rectranh.dbf:

CODE     HEAD2
127        0163
046        0105
111        0049


нужно связать данные из этих файлов и составить три txt файла с именами АВБ, АВВ и Б2 соответственно, в виде:
АВБ.txt
0163:42307810312487525410:1000.00:Иванов:Иван:Иванович:

АВВ.txt
0105:42358796510477456321:1000.00:Петров:Петр:Петрович:

Б2.txt
0049:42325895448752223655:3335.22:Сидоров:Сидор:Сидорович:

P.S.В этой теме мне помогли решить данную задачу при помощи BAT, но данных очень много в файле, возникают тормоза при обработке.Посоветовали напрямую работать с dbf файлами через реляционные операции SQL, но я в программировании не силён.
Автор: YuriyRR
Дата сообщения: 21.11.2010 12:02
serg3001

Цитата:
serg3001

Цитата:
нужно связать между собой данные из этих трех файлов, извлечь их в отдельную таблицу, после этого данные перенести в txt файл, который будет иметь спец. вид.

Используй MS ACCESS. Импортируй туда ДБФы и в конструкторе запросов свяжи их между собой и выбери нужные поля. Результат сохрани в текстовом файле или в XLS или ещё каком.
Автор: serg3001
Дата сообщения: 22.11.2010 11:37
YuriyRR, открыл в ACCESS файлы, но кодировка DOS отображается, подскажите а как можно поменять кодировку?
Автор: mcdie
Дата сообщения: 22.11.2010 17:35
serg3001
В нижеуказанной статье описан механизм замены кодировки DBF
В разделе OLE DB Provider for Visual FoxPro. Копировать не буду, там есть пример.
http://am.rusimport.ru/mSAccess/download.aspx?id=657

Но если OLE DB Provider for Visual FoxPro использовать, то нормально будет воспринимать кодировку, пишешь запрос (используя допустим TADOQuery) по своим таблицам, перебираешь результат и в цикле построково сохраняешь в файл. Все русские буквы должны сохранится правильно.
Автор: ant0ni02004
Дата сообщения: 22.11.2010 21:56
serg3001

можна еще TxQuery попробовать
Автор: MedvedevDM
Дата сообщения: 23.11.2010 15:58
Кто подскажет, как в делфи
в чек боксе сделать, чтобы галка была нестандартной,
- заменить ее на свою, например из картинки?
Автор: Man_Without_Face
Дата сообщения: 23.11.2010 16:12
MedvedevDM
Насколько я знаю со стандартными компонентами так нельзя. Можно с DevExpress (prperties->glyph). Или использовать те же скины в DevExpress.
Автор: YuriyRR
Дата сообщения: 24.11.2010 00:24

Цитата:
serg3001

Как известно, при чтении данных из dbf файла
Access ориентируется на значение параметра
DataCodePage в ключе HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\4.0\Engines\Xbase
Видимо в Вашем случае там записано OEM.
А Вы хотите ANSI. Ну или наоборот ). Или ветка [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\3.5\Engines\Xbase]
в зависимости от версии
Автор: ShIvADeSt
Дата сообщения: 24.11.2010 02:01
MedvedevDM

Цитата:
Кто подскажет, как в делфи
в чек боксе сделать, чтобы галка была нестандартной,
- заменить ее на свою, например из картинки?

Можно, но на чистом АПИ. Создаешь owner_draw чекбокс и рисуешь что хочешь на нем. Если интересно - могу дать свой кусок.
Автор: GRom V
Дата сообщения: 26.11.2010 05:59
Подскажите как можно запретить перетаскивание окна(формы) мышкой?
Автор: mcdie
Дата сообщения: 26.11.2010 08:14
GRom V
Ты про это?
Form.BorderStyle := bsSingle;
Form.Align := alCustom;

Страницы: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374

Предыдущая тема: MPO File


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