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

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

Автор: greenpc
Дата сообщения: 27.09.2010 15:16
Man_Without_Face

Код: cmd1.CommandText := 'INSERT INTO Test.dbf (FILIAL, VAL, DATE,WDT) VALUES (null, ''fff'', DateTime(2010,04,15,0,0,0), DateTime(1994,04,15,10,55,12))';
Автор: Man_Without_Face
Дата сообщения: 27.09.2010 16:10
greenpc
Отправил заказчику тестовый exe. У меня все работает, у него Syntax Error. Запустил с другого компьютера (Delphi не стоит) - "Не удается найти указанного поставщика. Вероятно он установлен неправильно". Я так понимаю это из за этого: Microsoft Visual FoxPro OLE DB Provider. Пробовал в корневой каталог с программой скинуть файл vfpoledb.msm (был там же где и качал Microsoft Visual FoxPro OLE DB Provider) - та же самая ошибка. Можно ли это как нибудь исправить не устанавливая Microsoft Visual FoxPro OLE DB Provider?
Автор: greenpc
Дата сообщения: 28.09.2010 07:49
Man_Without_Face
в данном контексте, IMHO, нет. halcon, apollo не понимают формат Visual FoxPro.

Цитата:
Пробовал в корневой каталог с программой скинуть файл vfpoledb.msm (был там же где и качал Microsoft Visual FoxPro OLE DB Provider) - та же самая ошибка.

вы хоть поняли, что сделали? думаю - нет. решение- создать исталятор и запихнуть туда msm или вытащить dll и зарегистрировать в системе.
Цитата:
Можно ли это как нибудь исправить не устанавливая...
ваша проблема в поле дата-время. это и есть ответ на вопрос. оставляйте только дату или создавайте поле float.
Автор: smirnvlad
Дата сообщения: 28.09.2010 13:43
Man_Without_Face
вроде TDbf понимает формат Visual FoxPro

Добавлено:
извиняюсь, уже советовали
Автор: Bonivur
Дата сообщения: 06.10.2010 10:20
Подскажите, как реализовать следующее... Нужен trackbar который бы менял громкость SW Synth (Синтезатор) в системном Микшере (системный файл sndvol32.exe). То есть менял бы громкость MIDI.
Автор: greenpc
Дата сообщения: 06.10.2010 10:49
Bonivur
_http://msdn.microsoft.com/en-us/library/aa908146.aspx
дальше надо?
_http://msdn.microsoft.com/en-us/library/dd798480(VS.85).aspx
Автор: Bonivur
Дата сообщения: 06.10.2010 13:43
greenpc
спасибо, но...

Цитата:
Minimum supported client    Windows 2000 Professional

к тому же внизу страницы _http://msdn.microsoft.com/en-us/library/dd798480(VS.85).aspx почитай, пишут что под Win7 и Vista не регулирует громкость именно MIDI, а только общую громкость (Master Volume).
Автор: greenpc
Дата сообщения: 06.10.2010 14:07
Bonivur
тогда в помошь миксер
unit MMSystem
Автор: Arberes
Дата сообщения: 07.10.2010 14:12
Здравствуйте!
Возникла непонятная проблема. Понадобилось установить 2007-ую Делфи на один компьютер. Взял проверенный дистрибутив (2007 v11.0.2902.10471), запускаю установку от имени админа (обычно там работают из-под пользователя), но получаю не совсем то, что хотел. Например, вот скрин окна выбора компонентов при установке

Устанавливаются только они, больше ничего нет.

Удалил всё, связанное с Codegear, из Program Files, Application Data и реестра, но всё равно такая же фигня. Кто-нибудь может подсказать, в чём проблема и как решить?
Автор: Andryshok
Дата сообщения: 08.10.2010 10:07
Arberes Насколько я понимаю, дело в том что за файлик вызапускаете для установки
Посмтрите файл autorun.inf находящийся в корне директории дистрибутива, там считывается информация о конфигурации, например вот
[AutoRun]
open=Install_RADStudio.exe
icon=delphi.ico, 0

[CONFIG]
SKU=RADSTUDIO
Автор: Arberes
Дата сообщения: 08.10.2010 11:59
В файле autorun.inf написано следующее:

[AutoRun]
open=Install.exe
icon=delphi.ico, 0

[CONFIG]
SKU=DELPHI_NET_ENT

Но по большому счёту это не важно. Я пробовал и просто Install.exe запускать, и напрямую Setup.exe из папки Install. Самый интерес в том, что такая ерунда только на одном компьютере, потому что из этого дистрибутива я ставил как минимум на два компьютера уже, причём не по одному разу.
Автор: Andryshok
Дата сообщения: 08.10.2010 13:18
Arberes Слушай, а не может такого быть, что среда уже была установлена ранее на машине на которой ты ставишь, и возможно некорректно удалена ? А, можт конфиг компонентов для установки сохранился и теперь инсталлер думает что они уже установлены ?
Автор: Arberes
Дата сообщения: 08.10.2010 15:58
Попробовал на другом компе, где уже установлена эта Делфи. Нормально показывает все компоненты, несмотря на то, что они уже установлены.
В любом случае, удалил из реестра, из Program Files, из Application Data всё, что связано с Codegear. «Borland» боюсь, ибо установлен InterBase v7.0, который создаёт кучу ключей «Borland». Что ещё можно удалить? Или как?
Автор: Frodo_Torbins
Дата сообщения: 08.10.2010 19:52
Arberes
Может попробовать запускать инсталлер с ключами? Как минимум "/upgrade" стоит попробовать.
Автор: Sarge1978
Дата сообщения: 12.10.2010 18:21
Доброго времени суток!
Можно ли как-то подменить стандартный Memory Manager в Runtime, а не в процессе компиляции?
Автор: Frodo_Torbins
Дата сообщения: 12.10.2010 18:34
Sarge1978
Конечно можно, специально для этого в модуле System есть процедуры Get/SetMemoryManager. Они используются например в ShareMem. Только делать это надо как можно раньше, не зря ShareMem всегда требуется объявлять первым юнитом в dpr-файле.
Автор: Sarge1978
Дата сообщения: 12.10.2010 21:12
Frodo_Torbins
Вот и я о том же. Это делается на этапе загрузки приложения. А так, чтобы не подключать менеджеры в файле проекта?
Нигде не нашел, как это можно сделать корректно в процессе работы программы. Куча нюансов, если используются DLL-ли.
Автор: Frodo_Torbins
Дата сообщения: 12.10.2010 22:19
Sarge1978
Можно и в процессе работы программы. При этом нужно следить, чтобы для каждого объекта и выделял и освобождал память один и тот же менеджер. Мне кажется, что если такое и удастся реализовать, то практической пользы будет не много.
Вы бы лучше объяснили для чего вам это надо, возможно найдется более подходящий способ. К примеру у объекта можно переопределить методы NewInstance и FreeInstance, которые отвечают за выделение памяти под него.
Автор: Sarge1978
Дата сообщения: 13.10.2010 12:05
Frodo_Torbins
Мне по заданию необходимо в процессе работы target программы подменять менеджер памяти на свой. Причем, извне. Так чтобы внешняя программа/процесс, который бы это делал(а) получал полный контроль над памятью целевой программы и всех ее DLL. В идеале, чтобы все они имели одинаковый менеджер памяти (к примеру, внешней программы). Я видел, как это делает, к примеру, FastShareMem, но он вкомпиливается в код...
Это нужно для получения доступа к published свойствам объектов target программы.
Автор: Frodo_Torbins
Дата сообщения: 13.10.2010 13:49
Sarge1978
Ох непростую вы себе задачу выбрали. Особенно если имеется ввиду не какая то конкретная, а любая Delphi-программа. В этом случае 100% действующих и правильных способов решения нету.
Во первых упомяну волшебные функции Read/WriteProcessMemory, они позволяют работать с чужой памятью напрямую.
Но если надо через менеджер памяти, то возникает первая проблема - нужно внедрить свой код в чужой процесс. В общем случае можно использовать хуки, ваше конкретное приложение может поддерживать плагины.
Далее менеджер памяти. Я вам предлагаю не подменять чужой своим, а самому использовать чужой вместо своего. Сделать это лучше сразу после загрузки своей длл-ки в чужой процесс. Если целевой процесс использует FastShareMem или FastMM4 с включенной опцией шаринга менеджера, то организовать подмену будет довольно просто. Если ничего подобного нету, то вы попали Вот тут Вопрос № 76637 обсуждалось возможное решение, но оно требует проверки на всех выпущенных версиях делфи, и к тому же не дает 100% гарантии.
Автор: finnk
Дата сообщения: 14.10.2010 07:30
Всем привет.Есть код процедуры удаления элемента из списка(односвязный список):

Код: procedure DeleteValue(var pos, head: list);
var
p: list;
begin
if head = nil then Exit;

if head.next = nil then
begin
MakeNull(head);
Exit;
end;

if pos = head then
begin
head:= head.next;
Exit;
end;

p:= head;
while(p.next <> pos) do
begin
p:= p.next;
if p = nil then Exit;//эт лишнее
end;
p.next:= p.next.next;
end;
Автор: smirnvlad
Дата сообщения: 14.10.2010 08:12
ошибка, видимо, не в этой процедуре
может при вызове pos и head передаются в обратном порядке?
ps. большие куски кода прячь под [no][more][/no]
Автор: finnk
Дата сообщения: 14.10.2010 15:05
да не все передается правильно, вот все написанное и используемое мной для работы со списком, может кто и поможет
[more]unit AbstractUnit;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Menus, XPMan, ComCtrls, ExtCtrls, Grids;


type
list = ^cell;

elementtype = record
author, name, subject: shortstring;
year: integer;
end;

cell = record
element: elementtype;
next: list;
end;

//------------------------------------------------------------------------------
procedure InsertValue(x: elementtype; var head, pos: list);
procedure PrintList(head: list);
procedure MakeNull(var head: list);
procedure SaveListToFile(head: list; fName: string);
procedure LoadListFromFile(var head: list; fName: string);
function Locate(x: elementtype; head: list): list;
procedure DeleteValue(var pos, head: list);
//------------------------------------------------------------------------------

var
head, pos: list;
x: elementtype;

implementation

uses MainUnit;

{вставляет элемент х в список}
procedure InsertValue(x: elementtype; var head, pos: list);
var
p: list;
begin
New(p);
if head = nil then head:= p
else pos.next:= p;

p.element:= x;
p.next:= nil;
pos:= p;
end;

{выводит элементы списка}
procedure PrintList(head: list);
var
p: list;
index: integer;
begin
if head = nil then
begin
Application.MessageBox('Список пуст','Внимание',MB_ICONWARNING+MB_OK);
MainForm.StringGrid1.RowCount:= 2;
MainForm.StringGrid1.Rows[1].Clear;
Exit;
end

else begin
index:= 1;
p:= head;
while(p <> nil) do
begin
MainForm.StringGrid1.Cells[0,index]:= IntToStr(index);
MainForm.StringGrid1.Cells[1,index]:= p.element.author;
MainForm.StringGrid1.Cells[2,index]:= p.element.name;
MainForm.StringGrid1.Cells[3,index]:= IntToStr(p.element.year);
MainForm.StringGrid1.Cells[4,index]:= p.element.subject;
p:= p.next;
inc(index);
MainForm.StringGrid1.RowCount:= index;
end;
end;
end;

{очистка списка}
procedure MakeNull(var head: list);
begin
head:= nil;
end;

{сохранение списка в файл}
procedure SaveListToFile(head: list; fName: string);
var
p: list;
f: file of elementtype;
begin
if head = nil then
begin
Application.MessageBox('Список пуст','Ошибка',MB_ICONERROR+MB_OK);
Exit;
end;

AssignFile(f, fName);
Rewrite(f);
p:= head;
while( p <> nil) do
begin
write(f, p.element);
p:= p.next;
end;
CloseFile(f);
end;

{загрузка списка из файла}
procedure LoadListFromFile(var head: list; fName: string);
var
f: file of elementtype;
begin
if head <> nil then
case Application.MessageBox('Список не пуст. Очистить его?','Внимание',MB_ICONQUESTION+MB_YESNO) of
mrYes:
begin
MakeNull(head);
MainForm.StringGrid1.RowCount:= 2;
MainForm.StringGrid1.Rows[1].Clear;
end;

mrNO:
Exit;
end;

AssignFile(f, fName);
Reset(f);

while not eof(f) do
begin
read(f,x);
InsertValue(x,head,pos);
end;
CloseFile(f);
end;

{возвращает позицию элемента х в списке}
function Locate(x: elementtype; head: list): list;
var
p: list;
begin
p:= head;
while(p <> nil) do
begin
if (p.element.author = x.author) and (p.element.name = x.name) and
(p.element.year = x.year) and (p.element.subject = x.subject) then
begin
Result:= p;
Exit;
end;
p:= p.next;
end;
Result:= nil;
end;

{удаление элемента из списка}
procedure DeleteValue(var pos, head: list);
var
p: list;
begin
if head = nil then Exit;

if head.next = nil then
begin
MakeNull(head);
Exit;
end;

if pos = head then
begin
head:= head.next;
Exit;
end;

p:= head;
while(p.next <> pos) do
begin
p:= p.next;
if p = nil then Exit;
end;
p.next:= p.next.next;
end;

end.
[/more]
Автор: smirnvlad
Дата сообщения: 14.10.2010 15:37
finnk
InsertValue не сохраняет целостность списка при вставке элемента в середину, а не конец, и не учитывает что pos может быть nil
[more]
Код: [no]procedure InsertValue(x: elementtype; var head, pos: list);
var
p: list;
begin
New(p);
p.element:= x;
p.next:= nil;

if head = nil then
head:= p
else begin
{куда вставлять если pos = nil ?}
if pos=nil then begin
{видимо в начало списка}
p.next := head;
head := p;
end else begin
{сохраняем указатель на следующий после pos}
p.next := pos.next;
pos.next := p;
end;
end;

pos:= p;
end; [/no]
Автор: finnk
Дата сообщения: 14.10.2010 17:34
smirnvlad
неа, не помогло, тоже самое при удалении последнего элемента, могу выложить сам проект, но думаю там нет ошибки
Автор: smirnvlad
Дата сообщения: 14.10.2010 18:23
finnk
ещё в загрузке списка
InsertValue(x,head,pos);
хотя pos может и не являться элементом списка (например, если список был очищен перед загрузкой), тогда при загрузке получается два списка один с началом в head из одного первого элемента, другой состоящий из всего остального загруженного, но указатель сохраняется в pos только для одного элемента (последнего загруженного)

отсутствует освобождение памяти при удалении элементов, очистке списка, но, думаю, это влияет только на занимаемый объем памяти
Автор: finnk
Дата сообщения: 14.10.2010 18:47

Цитата:
ещё в загрузке списка
InsertValue(x,head,pos);
хотя pos может и не являться элементом списка (например, если список был очищен перед загрузкой), тогда при загрузке получается два списка один с началом в head из одного первого элемента, другой состоящий из всего остального загруженного, но указатель сохраняется в pos только для одного элемента (последнего загруженного)

чет я не понял твою мысль, а про

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

известно,прост пока все на стадии разработки и потом будет учтено


Добавлено:
smirnvlad
спасибо огромное за помощь, решил свою проблему))))если интересует как-пиши, выложу измененный код
Автор: smirnvlad
Дата сообщения: 14.10.2010 19:42
finnk


Цитата:
чет я не понял твою мысль, а про

не, это я забыл что в конце вставки есть pos:= p;, так что там всё нормально

если ошибка в выложенном коде, конечно напиши
Автор: finnk
Дата сообщения: 14.10.2010 20:01
вот верный код(по крайней мере мою во время работы программы ошибок обнаружено не было), ну и нужна норм очистка списка
[more]unit AbstractUnit;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Menus, XPMan, ComCtrls, ExtCtrls, Grids;


type
list = ^cell;

elementtype = record
author, name, subject: shortstring;
year: integer;
end;

cell = record
element: elementtype;
next: list;
end;

//------------------------------------------------------------------------------
procedure InsertValue(x: elementtype; var head, pos: list);
procedure PrintList(head: list);
procedure MakeNull(var head: list);
procedure SaveListToFile(head: list; fName: string);
procedure LoadListFromFile(var head: list; fName: string);
function Locate(x: elementtype; head: list): list;
procedure DeleteValue(var pos, head: list);
//------------------------------------------------------------------------------

var
head, el_pos: list;
x: elementtype;

implementation

uses MainUnit;

{вставляет элемент х в список}
procedure InsertValue(x: elementtype; var head, pos: list);
var
p: list;
begin
New(p);
if head = nil then head:= p
else pos.next:= p;

p.element:= x;
p.next:= nil;
pos:= p;
end;

{выводит элементы списка}
procedure PrintList(head: list);
var
p: list;
index: integer;
begin
if head = nil then
begin
Application.MessageBox('Список пуст','Внимание',MB_ICONWARNING+MB_OK);
MainForm.StringGrid1.RowCount:= 2;
MainForm.StringGrid1.Rows[1].Clear;
Exit;
end

else begin
index:= 1;
p:= head;
while(p <> nil) do
begin
MainForm.StringGrid1.Cells[0,index]:= IntToStr(index);
MainForm.StringGrid1.Cells[1,index]:= p.element.author;
MainForm.StringGrid1.Cells[2,index]:= p.element.name;
MainForm.StringGrid1.Cells[3,index]:= IntToStr(p.element.year);
MainForm.StringGrid1.Cells[4,index]:= p.element.subject;
p:= p.next;
inc(index);
MainForm.StringGrid1.RowCount:= index;
end;
end;
end;

{очистка списка}
procedure MakeNull(var head: list);
begin
head:= nil;
end;

{сохранение списка в файл}
procedure SaveListToFile(head: list; fName: string);
var
p: list;
f: file of elementtype;
begin
if head = nil then
begin
Application.MessageBox('Список пуст','Ошибка',MB_ICONERROR+MB_OK);
Exit;
end;

AssignFile(f, fName);
Rewrite(f);
p:= head;
while( p <> nil) do
begin
write(f, p.element);
p:= p.next;
end;
CloseFile(f);
end;

{загрузка списка из файла}
procedure LoadListFromFile(var head: list; fName: string);
var
f: file of elementtype;
begin
if head <> nil then
case Application.MessageBox('Список не пуст. Очистить его?','Внимание',MB_ICONQUESTION+MB_YESNO) of
mrYes:
begin
MakeNull(head);
MainForm.StringGrid1.RowCount:= 2;
MainForm.StringGrid1.Rows[1].Clear;
end;

mrNO:
Exit;
end;

AssignFile(f, fName);
Reset(f);

while not eof(f) do
begin
read(f,x);
InsertValue(x,head,el_pos);
end;
CloseFile(f);
end;

{возвращает позицию элемента х в списке}
function Locate(x: elementtype; head: list): list;
var
p: list;
begin
p:= head;
while(p <> nil) do
begin
if (p.element.author = x.author) and (p.element.name = x.name) and
(p.element.year = x.year) and (p.element.subject = x.subject) then
begin
Result:= p;
Exit;
end;
p:= p.next;
end;
Result:= nil;
end;

{удаление элемента из списка}
procedure DeleteValue(var pos, head: list);
var
p: list;
begin
if head = nil then Exit;

if head.next = nil then
begin
MakeNull(head);
Exit;
end;

if pos = head then
begin
head:= head.next;
Exit;
end;

p:= head;
while(p.next <> pos) do p:= p.next;
if pos.next = nil then el_pos:= p;
p.next:= p.next.next;
end;

end.
[/more]
вот ссылка на код всей программы, может комы понадобиться, но она немного не доделана(освобождение памяти при очистке списка и удалении элемента, и еще не реализована сортировка)
Ссылка
Автор: Sarge1978
Дата сообщения: 18.10.2010 18:14
Как получить InitContext через RVA модуля?

Страницы: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374

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


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