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

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

Автор: HekTo
Дата сообщения: 17.03.2009 11:47
Добрый день.

Никто не подскажет, почем данный фрагмент в D2009 вызывает ошибку обращения к памяти ?

Код:
удалено
Автор: asdnsd
Дата сообщения: 17.03.2009 12:10
Добрый всем день

У меня возник следующий вопрос. Есть программа работающая с базой данных (MS SQL, DB2 не важно). Необходимо продумать каким образом можно в хранилище данных этой программы т.е в БД помещать данные из внешних систем. Внешние системы генерируют XML файлы.

Пока идеи следующие:
1. В программе создать некий редактор правил по преобразованию документов XML в набор данных (по типу XML Mapper) программы. Но пока не знаю с какой стороны подступится

2. Форматировать XML документы с помощью XSLT и получать например запросы к базе данных которые будет выполнять программа. (Продемонстрировано такое решение тут в конце статьи)
Основной недостаток этого способа администратору необходимо хорошо знать структуру БД.

Что можете посоветовать? Возможно есть более гибкое решение.
Автор: Aleksoid1978
Дата сообщения: 17.03.2009 13:34
HekTo

У меня все отлично работает в 2009, накидал быстро :

type
TStringItem = record
Index: Integer;
enText: string;
ruText: string;
Modified: Boolean;
end;

...

procedure TForm1.FormCreate(Sender: TObject);
Var
fItems: array of TStringItem;
begin
SetLength(fItems, 30);
end;
Автор: delover
Дата сообщения: 17.03.2009 19:00
asdnsd
Склонен к решению 2. Это имнетерсный мир. Но помимо этого решение состоит в том, что в Вашей проге имеются только Ваши данные и имеется возможность Вашими средствами заполнить эти данные правильно. Изучив Вашу программу заполнить базу сможет даже "простой вебер" ). Если есть возможность сформировать SQL там или интерактивную среду принимающую transformNod-ы, то Ваша задача по написанию правил и документаций закончена. Но это только иак называемый кастом импорт. А экспорт? Как думаете трансформ не подходит?
Автор: asdnsd
Дата сообщения: 17.03.2009 21:10
delover
Для экспорта данных во внешние приложения будет создан механизм выдачи XML файлов как локально (складировать куда надо по требованию), так и через HTTP протокол т.е будет создан web сервер, который принимая запросы в определённой задокументированной форме будет обращаться к шаблонам на стороне сервера и выдавать XML данные в той форме которая прописана в шаблонах.
Автор: Andrey128
Дата сообщения: 18.03.2009 08:28
Мне нужно отформатировать вещественные числа без указания Precision и Digits (я их не знаю).

Код: var
V: Double;
begin
V := 1.3;
Автор: Maks150988
Дата сообщения: 18.03.2009 19:42
Ребята, не знаю что делать, но необходима работа с Wide функциями реестра Windows. Необходимо прочитать список значений через RegEnumValueW, но в Delphi 7 параметр lpValueName Ansi, пришлось поэтому переделать в отдельном модуле функцию как:


Код: function _RegEnumValueW(hKey: HKEY; dwIndex: DWORD; lpValueName: PWideChar;
var lpcbValueName: DWORD; lpReserved: Pointer; lpType: PDWORD;
lpData: PByte; lpcbData: PDWORD): Longint; stdcall; external advapi32 name 'RegEnumValueW';
Автор: ZZZek
Дата сообщения: 18.03.2009 23:58
Кто-нибудь пробовал из Delphi выводить в Word формулы, которые потом открывались бы с помощью редактора формул или mathtype (OLE objects)? Подскажите, пожалуйста, как с этим возиться. Заранее спасибо.
Автор: ShIvADeSt
Дата сообщения: 19.03.2009 04:41
Maks150988
если честно, лень было разбираться - очень сильно ты перемудрил с пойнтером и прочим. Вот что нагуглил.


Код:
procedure TTntRegistry.GetValueNames(Strings: TTntStrings);
var
Len: DWORD;
I: Integer;
Info: TRegKeyInfo;
S: WideString;
begin
if (not Win32PlatformIsUnicode) then
inherited GetValueNames(Strings.AnsiStrings)
else begin
Strings.Clear;
if GetKeyInfo(Info) then
begin
SetLength(S, Info.MaxValueLen + 1);
for I := 0 to Info.NumValues - 1 do
begin
Len := Info.MaxValueLen + 1;
RegEnumValueW(CurrentKey, I, PWideChar(S), Len, nil, nil, nil, nil);
Strings.Add(PWideChar(S));
end;
end;
end;
end;

Автор: f3ka
Дата сообщения: 19.03.2009 12:15
ZZZek
ну получается формулы это ж как и сам ворд OleObject... наверно каким то образом можно в один OleObject за пихнуть другой
Автор: Demt
Дата сообщения: 19.03.2009 13:49
Вопрос по WinAPI в Delphi.
Требуется присвоить файлу атрибут 0x40 - FILE_ATTRIBUTE_DEVICE. Стандартным SetFileAttributes этого нельзя сделать (MSDN).
Даже если и задать через эту фунцию, то GetFileAttributes возращает 0x80 (Unused)
Крутил DeviceIOControl, но не понял, как и куда направлять поток открытого файла, если это вообще надо (открывать в потоке). Встречал пример для присвоения файлу атрибута "сжат".
Автор: V1s1ter
Дата сообщения: 21.03.2009 14:05
Простите за офтоп.
У меня перестала приходить подписка на этот форум, все темы.
А как у Вас.
Автор: Kolderon
Дата сообщения: 21.03.2009 15:26
Пытаюсь запретить сворачивание приложения (главной формы) по условию. Объявил

Код: Application.OnMinimize:=MyMinimize;
Автор: Figaro2000
Дата сообщения: 22.03.2009 12:03
Kolderon
глянь вот сюда - http://www.delphisources.ru/pages/faq/base/sys_buttons_down.html
может, наведет на мысли
Автор: kamikadze777
Дата сообщения: 22.03.2009 13:22
Доброго времени суток!!! У меня такая проблема:
Имеется checklistbox, база MS Access, запросы и т.д. При выборе элемента в checklistbox, активируется запрос на запись данных в базу. Подскажите пожалуйста, как мне осуществить проверку на наличие этих данных в базе при запуске программы и отметить соотвествующие строки в checklistbox? Заранее благодарен.
Автор: ekemov
Дата сообщения: 22.03.2009 16:59
kamikadze777
При загрузке грузишь данные, если есть то ставь галочку. Там же есть свойство ончикет, если есть то тру, если нету то так и оставляешь.
Автор: KurtWagner
Дата сообщения: 24.03.2009 05:06
Как скрыто отправить дубликат сообщение написанный в Outloock Express (стандартный почтовик) себе в указаный программно адрес ??? и еще один отделный вопрос как скрыто копировать файлы и папки? Заранее большое человеческое спасибо
Автор: bandyn
Дата сообщения: 24.03.2009 10:52
Delphi 2009 Кратко:
var
iNum: Integer;
sZero : AnsiString;

iNum:=8;
sZero:='0';
s:=StringOfChar(sZero,iNum - Length(s)) + s;
выдает ошибку: [DCC Warning] UMain.pas(62): W1058 Implicit string cast with potential data loss from 'string' to 'AnsiString'

а так не выдает: s:=StringOfChar('0',iNum - Length(s)) + s;

В справке: function StringOfChar(ch: AnsiChar; Count: Integer): AnsiString; overload;

Где подвох? в D7 все работало!
Автор: ShIvADeSt
Дата сообщения: 24.03.2009 14:24
bandyn

Цитата:
sZero : AnsiString;

сравни с этим

Цитата:
ch: AnsiChar

думаю поймешь в чем разница.
Автор: Frodo_Torbins
Дата сообщения: 24.03.2009 16:18
bandyn
А где вы видели ошибку? Warning - это еще не ошибка. А потеря данных при StringOfChar(ch: AnsiChar; Count: Integer): AnsiString; в любом случае возможна.
Автор: Maks150988
Дата сообщения: 24.03.2009 18:56
ShIvADeSt
Да вот если бы без нахлобучек VCL... =)

Кстати, назрел вопрос. Мне вот надо преобразовать png картинку в hBitmap на выходе. Полученная картинка требуется для дальнейшего наложения на окна - скинизация 32-битным битмапом к примеру. Захотел сделать функцию. Вот что получилось.


Код: function CreatebitBitmapFromPngFile(): hBitmap;
var
hTmpHdc : HDC;
hBmpNew: HBITMAP;
hBmpOld: HBITMAP;
Graphics : Cardinal;
GdiImage : Cardinal;
hMemHdc : HDC;
iHeight: UINT;
iWidth : UINT;
BmpInfo: BITMAPINFO;
lpBits : Pointer;
begin


GdipLoadImageFromFile('mspaint.png', GdiImage);
if GdiImage = 0 then
begin
Result := 0;
Exit;
end;

GdipGetImageHeight(GdiImage, iHeight);
GdipGetImageWidth(GdiImage, iWidth);

BmpInfo.bmiHeader.biSize := SizeOF(BmpInfo.bmiHeader);
BmpInfo.bmiHeader.biWidth := iWidth;
BmpInfo.bmiHeader.biHeight := iHeight;
BmpInfo.bmiHeader.biPlanes := 1;
BmpInfo.bmiHeader.biBitCount := 32;
BmpInfo.bmiHeader.biSizeImage := BmpInfo.bmiHeader.biWidth * BmpInfo.bmiHeader.biHeight * (BmpInfo.bmiHeader.biBitCount div 8);

hTmpHdc := GetDC(0);
hMemHdc := CreateCompatibleDC(hTmpHdc);
ReleaseDC(0, hTmpHdc);
hBmpNew := CreateDIBSection(hMemHdc, BmpInfo, DIB_RGB_COLORS, lpBits, 0, 0);
hBmpOld := SelectObject(hMemHdc, hBmpNew);
GdipCreateFromHDC(hMemHdc, Graphics);

GdipDrawImageRect(Graphics, GdiImage, 0, 0, iWidth, iHeight);

// тут непонятно что надо в результат
//Result := hBmpNew;

GdipDisposeImage(GdiImage);
GdipDeleteGraphics(Graphics);
DeleteObject(hBmpNew);
SelectObject(hMemHdc, hBmpOld);
DeleteDC(hMemHdc);
end;
Автор: ShIvADeSt
Дата сообщения: 25.03.2009 01:59
Maks150988

Цитата:
Мне вот надо преобразовать png картинку в hBitmap на выходе.

Посмотри тут, вроде что то умное
http://www.jose.it-berater.org/smfforum/index.php?topic=2820.0
Автор: Maks150988
Дата сообщения: 25.03.2009 17:04
ShIvADeSt
Все, разобрался. После GdipDrawImageRect.

GdipCreateHBITMAPFromBitmap(GdiImage, hImage, ARGB(0, 255, 0, 255));

И в результат помещаем hImage, который у нас объявлен как hBitmap в var.

Вобщем пока непонятно одно - фоновый цвет картинки. В модулях GDI+ под делфи прототип этой функцией выглядит ARGB. Непонятно как фон нужный задать - почему-то значение Blue "работает", а остальные в нулевом значении остаются. И в итоге результирующий цвет фона вида ргб(0,0,255), хотя мне нужен цвет фуксия - (255,0,255).

Модуль GDI+ для работы с изображением.

Код: unit F_GdiPlus;

interface

uses
Windows;

const
WINGDIPDLL = 'gdiplus.dll';

type
GDIPlusStartupInput = record
GdiPlusVersion : Integer;
DebugEventCallback : Integer;
SuppressBackgroundThread: Integer;
SuppressExternalCodecs : Integer;
end;

function GdiplusStartup(var token: Integer; var lpInput: GDIPlusStartupInput; lpOutput: Integer): Integer; stdcall; external WINGDIPDLL;
function GdiplusShutdown(var token: Integer): Integer; stdcall; external WINGDIPDLL;
function GdipCreateFromHDC(hDC: HDC; var Graphics: Cardinal): Integer; stdcall; external WINGDIPDLL;
function GdipLoadImageFromFile(FileName: PWideChar; var Image: Cardinal): Integer; stdcall; external WINGDIPDLL;
function GdipGetImageWidth(Image: Cardinal; var Width: UINT): Integer; stdcall; external WINGDIPDLL;
function GdipGetImageHeight(Image: Cardinal; var Height: UINT): Integer; stdcall; external WINGDIPDLL;
function GdipDrawImageRect(Graphics: Cardinal; Image: Cardinal; X, Y, Width, Height: Single): Integer; stdcall; external WINGDIPDLL;
function GdipDisposeImage(Image: Cardinal): Integer; stdcall; external WINGDIPDLL;
function GdipDeleteGraphics(Graphics: Cardinal): Integer; stdcall; external WINGDIPDLL;
function GdipCreateHBITMAPFromBitmap(Graphics: Cardinal; var Bitmap: hBitmap; Background: TColorRef): Integer; stdcall; external WINGDIPDLL;
function ARGB(A, R, G, B: Byte): TColorRef;

var
hGDILib : Cardinal;
StartUpInfo: GDIPlusStartupInput;
GdipToken : Integer;

implementation

function ARGB(A, R, G, B: Byte): TColorRef;
begin
Result := (DWORD(b) or (DWORD(g) shl 8) or (DWORD(r) shl 16) or (DWORD(a) shl 24));
end;

end.
Автор: bornbill
Дата сообщения: 25.03.2009 20:14
долго мучался в какой теме написать тут или по .NET решил тут.....
1. есть http://code.google.com/p/geckofx/
2. есть Delphi .net

Вопрос где можно найти примеры использования 1 во 2 гугл мне в помощь но найти ничего вразумительного не удалось.....
Заранее благодарен за направление ссылки и рекомендации
Автор: diodio
Дата сообщения: 26.03.2009 16:10
Добрый день!
Подскажите, можно ли залогинится на файл-сервер в сети из программы автоматом, используя известные логин/пароль, и, если можно - то как? :0

Автор: Kursist
Дата сообщения: 26.03.2009 22:23
Здравствуйте!
Такой вопрос, всё работает, но можно ли оптимизировать загрузку массива через файловый поток, чтобы не загружать в цикле побайтно:

for loop1:=0 to Len-1 do
FStream.Read(arr[loop1],SizeOf(Byte));

Хочется чего-то такого, но этот вариант не работает:
FStream.Read(arr[loop1],Len);
Автор: Frodo_Torbins
Дата сообщения: 26.03.2009 22:59
Kursist
Смотря массив чего. Если какие-нибудь интеджеры, то должно работать. Для строк же есть свой стрим.
Автор: Kursist
Дата сообщения: 27.03.2009 00:09
var
arr:PByteArray;
FStream:TFileStream;

а тогда уточню:
У меня есть файл с графической информацией, вначале идет различная инфа, а уже потом данные RGBA для OpenGL, то есть, записывались эти данные тоже побайтно, но вот хочется сразу блоком считать, но не получается, даже при texW=texH=256;

GetMem(arr, texW*texH*4); //4:=RGB+Alpha

Size:=texW*texH*4;
// FStream.Read(arr,Size); //вот так не работает!

for loop1:=0 to (texW*texH*4-1) do
FStream.Read(arr[loop1],SizeOf(Byte)); //
Автор: delover
Дата сообщения: 27.03.2009 07:44
Кто нибудь мне скажет чиво обозначает этот код, производитель которого Delphi?
Файл StdActns, Copyright (c) 1995-2005 Borland.

Код:
procedure TEditDelete.UpdateTarget(Target: TObject);
begin
Enabled := (GetControl(Target).SelLength > 0) and not GetControl(Target).ReadOnly;
end;
Автор: Mandor Sawall
Дата сообщения: 27.03.2009 09:26
Kursist
А так работает?
Код: FStream.Read(arr^,Size);

Страницы: 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667

Предыдущая тема: Глобальные переменные в разных формах с++ builder 'a.


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