Добро пожаловать,
Поиск
Мне нужно записать серию чисел в файл Paradox в blob-поле. Числа получаются из значений компонент, размещенных на форме. Затем мне нужно будет считывать числа из blob-поля и устанавливать согласно им значения компонент. Как мне сделать это?
Вы можете начать свое исследование со следующего модуля:
Код unit BlobFld;
interface
uses
SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
Forms, Dialogs, StdCtrls, Buttons, DBTables, DB, ExtCtrls, DBCtrls,
Grids, DBGrids;
type
TFrmBlobFld = class(TForm)
BtnWrite: TBitBtn;
Table1: TTable;
DataSource1: TDataSource;
DBNavigator1: TDBNavigator;
LbxDisplayBlob: TListBox;
Table1pubid: TIntegerField;
Table1comments: TMemoField;
Table1UpdateTime: TTimeField;
Table1Real1: TFloatField;
Table1Real2: TFloatField;
Table1Real3: TFloatField;
Table1Curr1: TCurrencyField;
Table1Blobs: TBlobField;
Table1Bytes: TBytesField;
CbxRead: TCheckBox;
procedure BtnWriteClick(Sender: TObject);
procedure DataSource1DataChange(Sender: TObject; Field: TField);
procedure FormShow(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private-Deklarationen }
public
{ Public-Deklarationen }
end;
var
FrmBlobFld: TFrmBlobFld;
implementation
{$R *.DFM}
type
ADouble = array[1..12] of double;
PADouble = ^ADouble;
procedure TFrmBlobFld.BtnWriteClick(Sender: TObject);
var
i: integer;
myBlob: TBlobStream;
v: longint;
begin
Table1.Edit;
myBlob := TBlobStream.Create(Table1Blobs, bmReadWrite);
try
v := ComponentCount;
myBlob.Write(v, sizeof(longint));
for i := 0 to ComponentCount - 1 do
begin
v := Components[i].ComponentIndex;
myBlob.Write(v, sizeof(longint));
end;
finally
Table1.Post;
myBlob.Free;
end;
end;
procedure TFrmBlobFld.DataSource1DataChange(Sender: TObject; Field: TField);
var
i: integer;
myBlob: TBlobStream;
t: longint;
v: longint;
begin
if CbxRead.Checked then
begin
LbxDisplayBlob.Clear;
myBlob := TBlobStream.Create(Table1Blobs, bmRead);
try
myBlob.Read(t, sizeof(longint));
LbxDisplayBlob.Items.Add(IntToStr(t));
for i := 0 to t - 1 do
begin
myBlob.Read(v, sizeof(longint));
LbxDisplayBlob.Items.Add(IntToStr(v));
end;
finally
myBlob.Free;
end;
end;
end;
procedure TFrmBlobFld.FormShow(Sender: TObject);
begin
Table1.Open;
end;
procedure TFrmBlobFld.FormClose(Sender: TObject;
var Action: TCloseAction);
begin
Table1.Close;
end;
end.
Как мне в таблице Paradox скопировать массив целочисленных чисел в TBlobField и наоборот? Элементы массива являются точками графика данных, который я хочу выводить, если запись доступна.
Запишите массив в поток памяти и затем используйте метод TBlob LoadFromStream. Для извлечения данных используйте метод TBlob SaveToStream (сохранение и извлечение массива из потока памяти).
Разместил: Вадим
Над каким элементом находится курсор мыши ?
Навигация в ListBox при множественном выборе
Как сделать так, чтобы при наведении на элемент, длина которого больше длины самого ListBox, появлялся Hint ?
Как узнать количество строк(записей) ?
Прокрутка ListBox на одну строку вниз
Удаление выбранных элементов в TListBoxНад каким элементом находится курсор мыши ?
Код // поместите на форму Form1 компонент ListBox1 и напишите
// следующий обработчик события OnMouseMove:
void __fastcall TForm1::ListBox1MouseMove(TObject *Sender,
TShiftState Shift, int X, int Y)
{
if(ListBox1->ItemAtPos(TPoint(X, Y), true) != -1)
Form1->Caption = ListBox1->Items->Strings[ListBox1->ItemAtPos(TPoint(X, Y), true)];
}
Навигация в ListBox при множественном выборе
Код // разместите на форме ListBox1, установите у него
// свойство MultiSelect в true, добавьте в ListBox1
// несколько элементов, разместите также на форме
// кнопку Button1, в обработчике события OnClick
// которой напишите следующий код, который будет
// выводить сообщение для каждого элемента ListBox,
// выбранного пользователем:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
for(int i = 0; i < ListBox1->Items->Count; i++)
if(ListBox1->Selected[i])
ShowMessage(ListBox1->Items->Strings[i]);
}
Как сделать так, чтобы при наведении на элемент, длина которого больше длины самого ListBox, появлялся Hint ?
Код // Где нибудь на показывании формы :
Application->HintPause = 0;
Application->HintShortPause = 0;
Application->HintHidePause = 10000000000;
Application->OnShowHint = TIn4Form->DoShowHint;
void __fastcall TIn4Form::DoShowHint(System::AnsiString &HintStr, bool
&CanShow, THintInfo &HintInfo)
{
CanShow = true;
if (HintInfo.HintControl == ListBox1 )
{
if( Mouse->Capture )
{
CanShow = false;
return;
}
HintInfo.ReshowTimeout = 100;
/*HintInfo.HintColor = clAqua;// Changes only for this hint*/
TPoint pnt;
SIZE strsize;
int numstr = ListBox1->ItemAtPos(HintInfo.CursorPos,true);
if(numstr<0)
{
CanShow = false;
Application->HideHint ();
return;
}
HintStr = ListBox1->Items->Strings[numstr];
strsize = ListBox1->Canvas->TextExtent(HintStr);
if(strsize.cx<=ListBox1->ClientWidth)
{
CanShow = false;
Application->HideHint ();
return;
}
pnt.x = -1;
pnt.y =
int(HintInfo.CursorPos.y/ListBox3->ItemHeight)*ListBox1->ItemHeight - 3;
pnt = ListBox3->ClientToScreen(pnt);
HintInfo.HintPos.x = pnt.x;
HintInfo.HintPos.y = pnt.y;
HintInfo.HintMaxWidth = Screen->Width-pnt.x;
/*HintInfo.HideTimeout = 100;*/
}
}// Не забудьте поставить ShowHint у интересующего ListBox-а
Как узнать количество строк(записей) ?
Код int i = ListBox1->Items->Count;
Прокрутка ListBox на одну строку вниз
Код // Чтобы прокрутить содержимое списка (TListBox) на одну
// строку вниз, напишите следующий код:
SendMessage(ListBox1->Handle, WM_VSCROLL, SB_LINEDOWN, 0);
Удаление выбранных элементов в TListBox
Код // Напишите следующий код:
for(int i = ListBox1->Items->Count-1; i >= 0; i--)
if(ListBox1->Selected[i])
ListBox1->Items->Delete(i);
У нас ест форма, на ней Image1 и Timer1, и на диске в одной папке содержатся рисунки. Попытаемся поочередно показывать эти рисунки в image1,
Код unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Image1: TImage;
Timer1: TTimer;
foto: TListBox;
procedure Button1Click(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1; i:word;
implementation
uses ShellAPI, ShlObj;// Нужны для работы с диалогом выбора
{$R *.dfm}
procedure FillBMPFileList(Folder: string; sl: TStrings);// процедура добавления файлов в список
var Rec : TSearchRec;
begin
sl.Clear;
if SysUtils.FindFirst(Folder + '*.bmp', faAnyFile, Rec) = 0 then
try
repeat
sl.Add(Folder+Rec.Name);
until SysUtils.FindNext(Rec) <> 0;
finally
SysUtils.FindClose(Rec);
end;
end;
function BrowseDialog(const Title: string; const Flag: integer): string;// вывод диалога выбора файлов
var
lpItemID : PItemIDList;
BrowseInfo : TBrowseInfo;
DisplayName : array[0..MAX_PATH] of char;
TempPath : array[0..MAX_PATH] of char;
begin
Result:='';
FillChar(BrowseInfo, sizeof(TBrowseInfo), #0);
with BrowseInfo do begin
hwndOwner := form1.Handle;
pszDisplayName := @DisplayName;
lpszTitle := PChar(Title);
ulFlags := Flag;
end;
lpItemID := SHBrowseForFolder(BrowseInfo);
if lpItemId <> nil then begin
SHGetPathFromIDList(lpItemID, TempPath);
Result := IncludeTrailingBackslash(TempPath);
GlobalFreePtr(lpItemID);
end;
end;
procedure TForm1.Button1Click(Sender: TObject);// запуск ункции вывода файлов
var fs : string;
begin
fs := BrowseDialog('Выберите папку с BMP файлами', BIF_RETURNONLYFSDIRS);
if fs = '' then Exit;
FillBMPFileList(fs, foto.Items);
timer1.Enabled:=true
end;
procedure TForm1.Timer1Timer(Sender: TObject);// вывод картинок на image
begin
if i= foto.Count-1 then exit;
image1.Picture.LoadFromFile(foto.Items.strings[i]);
inc(i);
end;
end
Внимание! Если у вас не получилось найти нужную информацию, используйте
рубрикатор или воспользуйтесь
поиском .
книги по программированию исходники компоненты шаблоны сайтов C++ PHP Delphi скачать