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

» Вопросы по Delphi

Автор: RostY
Дата сообщения: 03.04.2006 08:55
0bject
ты переводи 8-бит в 1 байт (символ) и сохраняй как строку весь масив

Добавлено:
00101011 = 43 (дес)

какой-то стринг := какой-то стринг + chr(43);

и т.д
потом стринг пишеш в базу
Автор: valerka78
Дата сообщения: 03.04.2006 10:19
А не проще поле БД сделать BlobMemo и пихать туда что хочешь и как хочешь?
Автор: Markell
Дата сообщения: 03.04.2006 10:21
fixer84

Цитата:
Markell
Можно через стандартные компоненты Delphi. Коннект с помощью ADOConnection, OLE DB Provider выбираешь Microsoft OLE DB Provider for SQL Server.

EZH

Цитата:
Markell
Либо через стандартные ADO компоненты, либо используя какие-то сторонние, типа SQL Server Direct Access Components (SDAC).

Через ADO соединение устанавливается. Однако, каким образом можно сделать так, чтобы пользователь сам из программы мог выбирать нужную ему БД? Может есть какой-нибудь кусочек кода, чтобы нагляднее было?
Автор: RostY
Дата сообщения: 03.04.2006 11:35
Markell

Цитата:
Через ADO соединение устанавливается. Однако, каким образом можно сделать так, чтобы пользователь сам из программы мог выбирать нужную ему БД?


дай пользователю возможность выбирать разные ConnectionString, или пусть выбирает базу и подставляй ее название в connectionString
Автор: SergeBS
Дата сообщения: 03.04.2006 11:50
JekaCh
Если думаешь, что такие хохмы будут работать на Винде старше W98, то сильно ошибаешься. А хочешь найти решение - лезь в
winio.zip - WinIo v2.0 - Direct Hardware Access Under Windows 9x/NT/2000/XP
(C)1998-2002 Yariv Kaplan http://www.internals.com
Исходники на С наличествуют.
Автор: fixer84
Дата сообщения: 03.04.2006 12:19
Markell

Код:
procedure TForm1.Button1Click(Sender: TObject);
begin
adoconnection1.close;
if editconnectionstring(adoconnection1) then
begin
adoconnection1.Connected:=true;
AdoTable1.active:=true;
end;
end;
Автор: Markell
Дата сообщения: 03.04.2006 12:21
Подскажите, плз, в чем может быть ошибка? Устанавливаю соединение с MSSQL БД через SQLConnection. Прописываю все параметры, тестирую, соединение установлено. Затем кидаю на форму SQLDataSet. Указываю свое соединение SQLConnection1, затем в CommandText пишу свой SQL запрос. Затем кидаю на форму DataSource. В свойствах указываю свой DataSet1, делаю его активным. Затем кидаю на форму DBGrid, чтобы в него выводить результат запроса. Но когда я в его свойствах хочу выбрать свой DataSource, вылетает ошибка "Operation not allowed on a unidirectional dataset" При этом программа компилируется нормально, но, естественно, никаких результатов не выдает.

Добавлено:
fixer84
Спасибо!
Автор: reenoip
Дата сообщения: 03.04.2006 22:40
valerka78
Нет, она в любом состоянии жрёт одинаково, это я хочу исправить

Про мышь смотри тему "Окно на первый план в Delphi 6" здесь же, в этой ветке.
Автор: whitewolfs
Дата сообщения: 04.04.2006 03:19
подскажите плз, как после применения Table1.Filter:='N='+'1'; узнать кол-во отфильтрованных строк?
Автор: ShIvADeSt
Дата сообщения: 04.04.2006 03:54
whitewolfs
Table1.RecordCount вот что тебе нужно.

Цитата:
Table1.Filter:='N='+'1';

Вот так лучше сразу Table1.Filter:='N=1';
Автор: George_Lucky
Дата сообщения: 04.04.2006 06:54
Всем добрый день!

Кто сталкивался с функцией FindFirst - поиска файла по шаблону?
Описываю ситуацию, в простой vcl-форме, она работает прекрасно.

Но у себя я использую Service, в определенный момент времени служба запускает функцию FindFirst для определения наличия необходимых файлов по заданному шаблону (E:\Data\imp*.zip) и не находит, хотя на самом деле файлы существуют. В чем причина? У Service ограниченная видимость или ограниченный доступ к каталогам?
Подскажите, если есть какие-то идеи. Спасибо
Автор: whitewolfs
Дата сообщения: 04.04.2006 07:27
ShIvADeSt а что даст RecordCount?
короче объясню все подробно. есть код:

Table1.Filter:='''NPD='+'TS[TID]''';
Table1.Filtered:=true;

while not Table1.eof do begin //============================
TEMPString3:=Table1.FieldByName('NPD').AsString;
if TEMPString3=TS[TID]
then begin //`````````````````````````````````````````````````````````
Table2.Insert;
for Num := 0 to Table1.FieldCount-1 do
begin
Table2.Edit;
Table2.Fields[Num].Assign(Table1.Fields[Num]);
end;
Table2.Post;

end; //````````````````````````````````````````````````````````
Table1.Next;
end; //============================

Смысл всего этого скопировать из Table1 все строки с нужным значением (переменная TS[TID]) в Table2. При этом используется компонент TDBF (http://sourceforge.net/projects/tdbf/) для доступа к базам без BDE. Базы - dbase III. Все работает, но медленно. Причем как выяснилось медленно работает из-за того, что фильтрация почемуто как бы не принимается во внимание. Тоесть начиная с while not... база читается всеравно с первой до последней строки, ЦЕЛИКОМ! Вопрос: ПОЧЕМУ??? Как сделать, чтоб читались только отфильтрованные строки, а не просматривалась вся база заново?
Автор: ShIvADeSt
Дата сообщения: 04.04.2006 07:50
whitewolfs
я делаю по другому,

Цитата:

Table1.Filter:='''NPD='+'TS[TID]'''; //что здесь за бред? если тебе нужно выбрать только записи у которых NPD=TS[TID], где TS[TID] это какое то значение, то не так это делается Table1.Filter:='NPD='''+IntToStr(TS[TID])+''''; //так как не знаю какого у тебя типа твое ТС(ТИД) то сделал перевод из целого в строку, ибо все равно некоторые моменты твоей записи не понятны.
Table1.Filtered:=true;

далее
Table1.First;
for i:=1 to Table1.RecordCount do begin
... здесь делаем что нам надо
Table1.Next;
end; // конец цикла, у меня всегда все это правильно срабатывало, есть вариант, что у тебя просто фильтрация криво написана, так как из твоей записии вообще не должно было не одной записи отразиться либо EOF сбрасывает фильтр.
Автор: ArtemiyUO
Дата сообщения: 04.04.2006 08:03
George_Lucky
код покажи
Автор: 0bject
Дата сообщения: 04.04.2006 08:13

Цитата:
Кто сталкивался с функцией FindFirst - поиска файла по шаблону?


const
FileAttrs : integer = faDirectory;// faHidden faSysFile faVolumeID faDirectory faDirectory faArchive faAnyFile
startd:string = 'd:\';
bagchar:string = '\/:*?<>| ';

procedure TForm1.getdirk(startdir:string);
var
sr: TSearchRec;
begin
if FindFirst(startdir+'*', FileAttrs, sr) = 0 then
begin
repeat
if (sr.Attr and FileAttrs) = sr.Attr then // если это директория
begin
.....
.....
until FindNext(sr) <> 0;
FindClose(sr);
end;
end;


-----
ну вот у меня было что-то на подобе этого,,, -все работало
Автор: Schatz
Дата сообщения: 04.04.2006 09:39
День добрый.
Передаю данные через Indy(TCP) компаненты.
Передаю из WIN приложения в Dll

Вот структура передаваемых данных

TDate=Record
NumberString:Byte;
Text:String[255];
KolVo:Integer;
Summ:Comp;
end;
TCommBlock = record
Command:string[100];
MyUserName:string[100];
ReceiverName: string[100];
Msg:String[255];
Table:Array[0..99] of TDate;
Otdel:Byte;
Summa:Comp;
end;

При передачи этой записи происходит следующее:
При первой передаче все приходит безупречно,
при второй передаче данные как будто смещаются на неопределенное количество байт в право, т.е. Command,MyUserName,ReceiverName,Msg - приходят пустыми,
а массив Table[0],Table[1]содержит байты которые должны были быть в Command,MyUserName,ReceiverName,Msg, все остальные ячейки Table забиты мусором.

Как я выяснил, здесь как минимум две проблемы:
1) массив Table типа TDate в котором есть Summa:Comp;
2) Summa:Comp;
Если убрать таблицу и убрать Summa тогда данные передаются без искажения.
Так же заметил что если код библтотеки перенести на обычное win приложение то передача данных происходит нормально.

Отсюда вывод что в момент динамического создания клиента в библиотеке я где то что то не так делаю, вот код в котором я создаю клиента
Client:=TIdTCPClient.Create(Nil);
Client.ASCIIFilter:=False;
Client.Port:=2001;
Client.MaxLineLength:=16384;
Client.MaxLineAction:=maException;
Client.RecvBufferSize:=32768;
Client.RecvBufferSize:=32768;
Client.OnConnected:=ClientConnected;
Client.OnDisconnected:=ClientDisconnected;

Может здесь что то не так...

Просьба подсказать что я делаю не так. Зарание огромное спасибо.
Автор: vshersh
Дата сообщения: 04.04.2006 09:50
George_Lucky
Посмотри под каким аккаунтом служба работает. Возможно просто прав не хватает (если файловая система NTFS)
Чтобы понять, запусти под админом -- и увидишь работает вобще, или нет

Добавлено:
Schatz
Ну во первых
Код: The Comp (computational) type is native to the Intel processor architecture and represents a 64-bit integer. It is classified as a real, however, because it does not behave like an ordinal type. (For example, you cannot increment or decrement a Comp value.) Comp is maintained for backward compatibility only. Use the Int64 type for better performance.
Автор: Schatz
Дата сообщения: 04.04.2006 10:10
vshersh

Цитата:
Если проблема действительно в этом... - можно поробовать заменить на Инт64


Попробовал перебрать все доступные типы и целые и вещественные, все равно второй раз приходит мусор.

Добавлено:
Кажется нашел проблему.
При передачи данных
CB:TCommBlock;
SizeOf(CB)=1104
При приеме данных
CB:TCommBlock;
SizeOf(CB)=1194

Но при этом и на сервере и в клиенте тип TCommBlock - это одна и та же запись, с точностью до запятой.

Почему же EXE'шник считает что моя запись весит 1104 а DLL'ка говорит что вес моез записи 1194, на 90 байт больше, не понимаю.

Добавлено:
Вот только понять теперь не могу что мне делать, надо либо в клиенте массив уменьшать и подгонять его под "размер" сервера, либо выкручиваться каким то другим способом.
Сейчас попробую выяснить что за тип мне такие пакости в массиве сделал.
Автор: vshersh
Дата сообщения: 04.04.2006 10:23
Schatz
Попробуй объявить packed record и после этого сравнить размеры
Автор: Schatz
Дата сообщения: 04.04.2006 10:35

Цитата:
Попробуй объявить packed record и после этого сравнить размеры

Можно поподробнее про packed record, я просто не совсем понял
Автор: vshersh
Дата сообщения: 04.04.2006 10:38
Schatz

Код: TDate=packed Record
NumberString:Byte;
Text:String[255];
KolVo:Integer;
Summ:Comp;
end;
TCommBlock = packed record
Command:string[100];
MyUserName:string[100];
ReceiverName: string[100];
Msg:String[255];
Table:Array[0..99] of TDate;
Otdel:Byte;
Summa:Comp;
end;
Автор: Schatz
Дата сообщения: 04.04.2006 10:49
vshersh
В библиотеке объявление packed Record никак не повлияло на размер записи, а вот в приложении размер уменьшился, но недостаточно.
Автор: vshersh
Дата сообщения: 04.04.2006 10:53
Schatz
Чтото там не так...
Не может быть разный размер.
Я советую вобще описание записей (с packed) вынести в отдельный юнит и юзать его в 2-х проектах.
Попробуй для эксперимента просто передать запись, например, с 1 строкой и одним числом:
Код: TTestRec = packed record
str: string[10];
dbl: double;
end;
Автор: Schatz
Дата сообщения: 04.04.2006 10:56
vshersh
Огромное спасибо, очень сильно помог

Вынес описание типов в отдельный юнит, прописал packed record, теперь и в приемнике и в передатчике одинаковый размер.

Еще раз огромное спасибо, не первый раз уже выручаешь меня.
Автор: Markell
Дата сообщения: 04.04.2006 14:39
Подскажите, плз, каким образом в Delphi под Win32 можно указать символ ' (апостроф) посередине стринговой строки? Т.е., если я хочу вывести на печать кусочек текста, где встречается такой символ ', то он обрывает эту строку вывода, а надо, чтобы он был ее частью..
Автор: EZH
Дата сообщения: 04.04.2006 14:44
Markell
Пиши его 2 раза подряд - ''
Автор: DroN_S
Дата сообщения: 04.04.2006 14:47
Markell
делаешь тройный ковычки (апострофы)
вот так 'Привет '''+' ЧУВАК!!!';
Автор: waik
Дата сообщения: 04.04.2006 14:47
Markell
Поставь два апострофа подряд... Типа такого:
Stroka := 'Это пример для '' и его использования в строке';

Stroka будет равна "Это пример для ' и его использования в строке"

Ну или через chr(код символа) и плюсом складывай
Автор: DroN_S
Дата сообщения: 04.04.2006 14:50
waik

Цитата:
Stroka := 'Это пример для '' и его использования в строке';

ты не прав, так у тебя оборвётся строка...
Автор: Z MeZe
Дата сообщения: 04.04.2006 15:07
Markell

Цитата:
вот так 'Привет '''+' ЧУВАК!!!';


Цитата:
Stroka := 'Это пример для '' и его использования в строке';

И тот и другой вариант правильные.
DroN_S
Прежде чем говорить:
Цитата:
ты не прав, так у тебя оборвётся строка...
,
вставь в дельфи и проверь

Страницы: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768

Предыдущая тема: Вероятность одинакового CRC32


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