Все технические форумы на одном сайте Удобный поиск информации с популярных форумов в одном месте
Вопрос: Как в design-time на форме показать картинку из .res файла программы?

Добрый день!

История: есть свой компонент наследник TBitBtn. У этого компонента есть свойство IconName: String (в реале иерархия чуть более сложна - что тоже может служить причиной того что это не работает).
В run-time при установке этого свойства из ресурсов программы загружается картинка по этому имени.

В .dpr сейчас прописаны ресурсы
{$R 'My_png_icons.res' 'res\My_png_icons.rc'}

Загрузка ресурса сейчас происходит так:
procedure MyLoadResourceSimplified);
var
  tmpRS:TResourceStream;
begin
  tmpRS := nil;
  try
    tmpRS := TResourceStream.Create(HInstance, aResName, RT_RCDATA);
    try
      tmpRS.Position:=0;
      if aGraphic is TBitmap then
        _LoadAsPng(tmpRS)
      else
      if aGraphic is TIcon then
        _LoadAsIcon(tmpRS)
    except
    end;
  finally
    tmpRS.Free;
  end;
end;


Что хочу:
Понять, должен ли этот код работать в Design-time (у меня пока не работает - но реальная реализация у меня сложнее).
И идей - как можно сделать чтобы он заработал.
Ответ: debose,

Из перечисленных неудобств только парочку можно засчитать за реальные минусы.
К тому же сабж сильно зависит от задачи. Для КИС иконки/настройки очень удобно хранить в БД.

Во всех броузерах есть локальные БД. В ФФ это СклЛайт.
Вопрос: Разница в координатах в run-time и design-time

Может кто-нибудь объяснить почему координаты любого объекта(например Tshape) отличаются во время
run и design?
Например если создать код и кинуть туда shape и сравнить коры, они не совпадут
Delphi
1
2
3
4
procedure Tform1.FormCreate(Sender: TObject)
Begin
ShowMessage(IntToStr(Shape1.Left)+' '+inttostr(Shape1.top)
end;
Откуда берется эта разница? Как устранить эту разницу?
Ответ: Просто кинул на форму
Вопрос: как в design-time кинуть UserControl на форму и отредактировать?

Ctrl+V + Ctrl+V - копируются только контролы, расположенные на UserControl... а если выбираю в Toolbox созданный UserControl1 и пытаюсь его кинуть на форму получаю Failed to load toolbox item 'UserControl1'. It will be removed from the toolbox. (VS2015, Platform target установлен в Any CPU)
Ответ: FB Programmer, в Designer ни чего не делай, никогда (разве что при каком нибудь "крахе").

А так вот например:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class UserControl1: UserControl
    {
        public UserControl1()
        {
            InitializeComponent();
        }
        /// <summary>
        /// Не лучший пример и видеть сие свойство в дизайнере не надо, но в коде спокойно можно юзать
        /// </summary>
        [Browsable(false)]
        public Button Button1 { get { return button1; } }

        /// <summary>
        /// Текст для кнопки button1
        /// </summary>
        [Description("Текст для кнопки button1")]
        [Browsable(true)]
        public string Button1Caption { get { return button1.Text; } set { button1.Text = value; } }
...
Вопрос: Drag-n-Drop на самопальный компонент в Design-Time

Привет, чисто из любопыства что не так.

На свой компонент (наследник панели на которой ещё несколько) кидаю TSpeedButton и он оказывается НЕ на самой верхней. Т.е. становится невидимой кнопка. Приходится сначала добавлять TPanel, а затем лишь уже на неё кидать TSpeedButton. Ну да, TPanel/TButton и прочие почему-то оказываются на самой верхней..., но не TSpeedButton.

Выглядит так:


Задумано, чтобы с/раз ворачиваться, рисовать линии на канвасе было лень, поэтому просто использовал несколько панелей и их края в кач-ве авто-полосок =)
Возможно починить? XE7

Компонент:
+
unit FRollup;

interface

uses
  System.SysUtils, System.Classes, Vcl.Controls, Vcl.ExtCtrls, Vcl.Graphics, Vcl.StdCtrls;

type
  TRollup = class(TPanel)
  private
    FContainer : TPanel;
    FPanel : TPanel;
    FText1 : TStaticText;
    FText2 : TStaticText;
    FExpanded : Boolean;
    FExpandedSize : Integer;
  private
    function GetTitle:string;
    procedure SetTitle(Value:string);
    procedure SetExpanded(Value:Boolean);
    procedure SetExpandedSize(Value:Integer);
    procedure DoExpand(Sender:TObject);
  protected
    procedure Resize;override;
  public
    constructor Create(AOwner:TComponent);override;
    destructor Destroy;override;
  published
    property Title:string read GetTitle write SetTitle;
    property Expanded:Boolean read FExpanded write SetExpanded;
    property ExpandedSize:Integer read FExpandedSize write SetExpandedSize;
  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('3ds Max', [TRollup]);
end;

constructor TRollup.Create(AOwner:TComponent);
begin
inherited ;
FExpanded := True;
FExpandedSize := 200;
with Self do
begin
  //Align := alTop;
  //AlignWithMargins := True;
  BevelOuter := bvNone;
  //DoubleBuffered := True;
  Caption := '';
  Height := FExpandedSize + 10;
  //Left := 3;
  //Margins.Bottom := 3;
  //Margins.Left := 3;
  //Margins.Right := 3;
  //Margins.Top := 3;
  ShowCaption := False;
  //Top := 3;
  Width := 188;
end;
FContainer := TPanel.Create(Self);
with FContainer do
begin
  Align := alCustom;
  AlignWithMargins := True;
  Anchors := [akLeft, akTop, akRight, akBottom];
  BevelKind := bkFlat;
  BevelOuter := bvNone;
  Caption := '';
  Height := FExpandedSize;
  Left := 0;
  Margins.Bottom := 0;
  Margins.Left := 0;
  Margins.Right := 0;
  Margins.Top := 0;
  ShowCaption := False;
  Top := 9;
  Width := 188;
  Parent := Self;
end;
FPanel := TPanel.Create(Self);
with FPanel do
begin
  Align := alTop;
  AlignWithMargins := True;
  BevelKind := bkFlat;
  BevelOuter := bvNone;
  Caption := '';
  Height := 18;
  Left := 5;
  Margins.Bottom := 0;
  Margins.Left := 5;
  Margins.Right := 5;
  Margins.Top := 0;
  ShowCaption := False;
  Top := 0;
  Width := 178;
  OnClick := DoExpand;
  OnDblClick := DoExpand;
  Parent := Self;
end;
FText1 := TStaticText.Create(Self);
with FText1 do
begin
  Align := alLeft;
  AlignWithMargins := True;
  Caption := #150;
  Constraints.MaxWidth := 10;
  Constraints.MinWidth := 10;
  Font.Style := [fsBold];
  Height := 14;
  Left := 3;
  Margins.Bottom := 0;
  Margins.Left := 3;
  Margins.Right := 0;
  Margins.Top := 0;
  Top := 0;
  Width := 10;
  OnClick := DoExpand;
  OnDblClick := DoExpand;
  Parent := FPanel;
end;
FText2 := TStaticText.Create(Self);
with FText2 do
begin
  Align := alClient;
  Alignment := taCenter;
  AlignWithMargins := True;
  Caption := 'Title Text';
  Height := 14;
  Left := 10;
  Margins.Bottom := 0;
  Margins.Left := 0;
  Margins.Right := 20;
  Margins.Top := 0;
  Top := 0;
  Width := 146;
  OnClick := DoExpand;
  OnDblClick := DoExpand;
  Parent := FPanel;
end;
end;

destructor TRollup.Destroy;
begin
FreeAndNil(FText1);
FreeAndNil(FText2);
FreeAndNil(FPanel);
FreeAndNil(FContainer);
inherited Destroy;
end;

function TRollup.GetTitle:string;
begin Result := FText2.Caption;end;

procedure TRollup.SetTitle(Value:string);
begin FText2.Caption := Value;end;

procedure TRollup.SetExpanded(Value:Boolean);
begin
if Value <> FExpanded then
  DoExpand(Self);
end;

procedure TRollup.SetExpandedSize(Value:Integer);
begin
if Value <> FExpandedSize then
begin
  if Value<15 then
    FExpandedSize := 15 else
  if Value>4096 then
    FExpandedSize := 4096 else
    FExpandedSize := Value;
end;
if FExpanded then
begin
  Height := FExpandedSize + 10;
  FContainer.Height := FExpandedSize;
end else
begin
  Height := 20;
  FContainer.Height := 10;
end;
end;

procedure TRollup.DoExpand(Sender:TObject);
begin
FExpanded := not FExpanded;
if FExpanded then
begin
  Height := FExpandedSize + 10;
  FText1.Margins.Left := 3;
  FText1.Caption := #150;
  FText2.Margins.Right := 20;
  FContainer.Top := 9;
  FContainer.Height := FExpandedSize;
end else
begin
  Height := 20;
  FText1.Margins.Left := 2;
  FText1.Caption := '+';
  FText2.Margins.Right := 19;
  FContainer.Top := 4;
  FContainer.Height := 10;
end;
end;

procedure TRollup.Resize;
begin
SetExpandedSize(FExpandedSize);
FContainer.Width := Width;
inherited ;
end;

end.
Ответ: С грехом пополам:

+
unit FRollup;

interface

uses
  System.SysUtils, System.Classes, System.Types, Vcl.Controls, Vcl.ExtCtrls, Vcl.Graphics, Vcl.StdCtrls;

type
  TRollup = class(TPanel)
  private
    FSign : TStaticText;
    FPanel : TPanel;
    FExpanded : Boolean;
    FExpandedSize : Integer;
    FExpandedMarginsH : Integer;
    FExpandedMarginsV : Integer;
  private
    function GetTitle:string;
    procedure SetTitle(Value:string);
    procedure SetExpanded(Value:Boolean);
    procedure SetExpandedSize(Value:Integer);
    procedure SetExpandedMarginsH(Value:Integer);
    procedure SetExpandedMarginsV(Value:Integer);
    function GetExpandedShowSign:Boolean;
    procedure SetExpandedShowSign(Value:Boolean);
    procedure DoExpand(Sender:TObject);
    procedure DoExpandedMarginsH(Value:Integer);
    procedure DoExpandedMarginsV(Value:Integer);
  protected
    procedure Paint;override;
    procedure Resize;override;
  public
    constructor Create(AOwner:TComponent);override;
  published
    property Title:string read GetTitle write SetTitle;
    property Expanded:Boolean read FExpanded write SetExpanded;
    property ExpandedSize:Integer read FExpandedSize write SetExpandedSize;
    property ExpandedMarginsH:Integer read FExpandedMarginsH write SetExpandedMarginsH;
    property ExpandedMarginsV:Integer read FExpandedMarginsV write SetExpandedMarginsV;
    property ExpandedShowSign:Boolean read GetExpandedShowSign write SetExpandedShowSign;
  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('3ds Max', [TRollup]);
end;

constructor TRollup.Create(AOwner:TComponent);
begin
inherited Create(AOwner);
FExpanded := True;
FExpandedSize := 200;
FExpandedMarginsH := 3;
FExpandedMarginsV := 3;
with Self do
begin
  BevelOuter := bvNone;
  Caption := '';
  Height := FExpandedSize + 10;
  ShowCaption := False;
  Width := 188;
end;
FPanel := TPanel.Create(Self);
with FPanel do
begin
  Align := alTop;
  AlignWithMargins := True;
  BevelKind := bkFlat;
  BevelOuter := bvNone;
  Caption := 'Title Text';
  Height := 18;
  Left := 10;
  Name := 'RollupTitle';
  Margins.Bottom := 0;
  Margins.Left := FExpandedMarginsH+5;
  Margins.Right := FExpandedMarginsH+5;
  Margins.Top := 0;
  ShowCaption := True;
  Top := 0;
  Width := 178;
  OnClick := DoExpand;
  OnDblClick := DoExpand;
  Parent := Self;
end;
FSign := TStaticText.Create(FPanel);
with FSign do
begin
  Align := alLeft;
  AlignWithMargins := True;
  Caption := #150;
  Constraints.MaxWidth := 10;
  Constraints.MinWidth := 10;
  Font.Style := [fsBold];
  Height := 14;
  Left := 3;
  Name := 'RollupSign';
  Margins.Bottom := 0;
  Margins.Left := 3;
  Margins.Right := 0;
  Margins.Top := 0;
  Top := 0;
  Width := 10;
  OnClick := DoExpand;
  OnDblClick := DoExpand;
  Parent := FPanel;
end;
end;

function TRollup.GetTitle:string;
begin Result := FPanel.Caption;end;

procedure TRollup.SetTitle(Value:string);
begin FPanel.Caption := Value;end;

procedure TRollup.SetExpanded(Value:Boolean);
begin
if Value <> FExpanded then
  DoExpand(Self);
end;

procedure TRollup.SetExpandedSize(Value:Integer);
begin
if Value <> FExpandedSize then
begin
  if Value<20 then
    Value := 20;
  FExpandedSize := Value;
  DoExpandedMarginsH(FExpandedMarginsH);
  DoExpandedMarginsV(FExpandedMarginsV);
end;
if FExpanded then
  Height := FExpandedSize else
  Height := 18;
if (csDesigning in ComponentState) then
  Repaint;
end;

procedure TRollup.SetExpandedMarginsH(Value:Integer);
begin
if FExpandedMarginsH <> Value then
begin
  DoExpandedMarginsH(Value);
  if (csDesigning in ComponentState) then
    Repaint;
end;
end;

procedure TRollup.SetExpandedMarginsV(Value:Integer);
begin
if FExpandedMarginsV <> Value then
begin
  DoExpandedMarginsV(Value);
  if (csDesigning in ComponentState) then
    Repaint;
end;
end;

function TRollup.GetExpandedShowSign:Boolean;
begin Result := FSign.Visible;end;

procedure TRollup.SetExpandedShowSign(Value:Boolean);
begin FSign.Visible := Value;end;

procedure TRollup.DoExpand(Sender:TObject);
begin
FExpanded := not FExpanded;
if FExpanded then
begin
  Height := FExpandedSize;
  FSign.Margins.Left := 3;
  FSign.Caption := #150;
end else
begin
  Height := 18;
  FSign.Margins.Left := 2;
  FSign.Caption := '+';
end;
if (csDesigning in ComponentState) then
  Repaint;
end;

procedure TRollup.DoExpandedMarginsH(Value:Integer);
begin
if ((Width - (Value shl 1)) < 75) then Value := (Width - 75) div 2;
if (Value < 0) then Value := 0;
FExpandedMarginsH := Value;
FPanel.Margins.Left := FExpandedMarginsH + 5;
FPanel.Margins.Right := FExpandedMarginsH + 5;
end;

procedure TRollup.DoExpandedMarginsV(Value:Integer);
begin
if ((FExpandedSize - Value) < 18) then Value := FExpandedSize - 18;
if (Value < 0) then Value := 0;
FExpandedMarginsV := Value;
end;

procedure TRollup.Paint;
var
R : TRect;
H : Integer;
begin
inherited Paint;
try
  Canvas.Lock;
  try
    H := Height - FExpandedMarginsV;
    if H < 14 then H := 14;
    if FExpanded then
      R := Rect(FExpandedMarginsH, 9, Width - FExpandedMarginsH, H) else
      R := Rect(FExpandedMarginsH, 4, Width - FExpandedMarginsH, 14);
    Canvas.Brush.Style := bsClear;
    Canvas.Pen.Color := clBtnShadow;
    Canvas.Pen.Style := psSolid;
    Canvas.Pen.Width := 1;
    Canvas.Rectangle(R);
  except

  end;
finally
  Canvas.Unlock;
end;
end;

procedure TRollup.Resize;
var
H, V : Integer;
begin
if FExpanded then
begin
  H := FExpandedMarginsH;
  V := FExpandedMarginsV;
  SetExpandedSize(Height);
  if H <> FExpandedMarginsH then
    SetExpandedMarginsH(H);
  if V <> FExpandedMarginsV then
    SetExpandedMarginsH(V);
end else Height := 18;
inherited Resize;
end;

end.

Отрисовал, добавил настройку внутренней границы, но верхную панель таки оставил ну и надо Align переопределять и обрезку реализовать.
Впрочем неважно, тут у TControl или TWinControl обнаружил метод InsertControl, а он не виртуальный. Так-то наверно получился бы легкий путь.
Вопрос: Нет формы в design-time

Здравствуйте! Странная штука произошла с проектом. В редакторе пропала форма. То есть код видно, а форму открыть не могу. В менеджере проекта форма тоже показывается. При компиляции все ОК, форма есть и свои функции выполняет.
Ответ: Точно) Убежало за края экрана. Alt+Space и потом Р(русская)
Вопрос: Design-Time Errors in the Windows Forms Designer

Программа с формами работает, появляется картинка в последней форме, закрываю и снова открываю окно формы - могу спокойно работать, сталкивался ли кто, может ли это аукнуться в дальнейшей работе, на форуме по ссылке прочитал, что эта ошибка вызвана криво написанным кодом.
Ответ: hext, тогда это возможно глюк VS на который можно закрыть глаза. Особенно если все работает. Тем не менее мождно попробовать а) закрыть все файлы, сделать Clean решения и перекомпилировать его б) установить обновления для VS. Для 2010 - SP1, для 2012 - Update 5, для 2013 - Update 4.
Вопрос: Как правильно создать ActionList в run-time?

Создаю всё так:
Код

  FActionList := TActionList.Create(Form);
  FAction := TAction.Create(Form);
  FAction.ActionList := FActionList;

На FAction вешаю горячие клавиши (ради ГК с экшенами всё и затеял)

У меня есть главная форма и дочерние. На главной всё пашет. На дочерних - нет. То есть, если на экшене главной вешаю действие на F1 и на дочерней действие связано с F1, то экшен дочерней формы не срабатывает. Если на дочернюю вешаю другую клавишу, то всё срабатывает. Короче, если не перекрываются, то ок, иначе работает только на главной форме.

Если всё создавать в design-time, то работает и на главной и на дочерних, но мне надо в run-time.

Обнаружил, что если созданные мною экшены кидать на созданные в дизайне экшен-листы, то всё пашет. Если наоборот, кидать дизайновские экшены на созданные в ран-тайме листы, то не пашет. Делаю вывод, что я неправильно создаю листы. Но как надо - хз.

Пытался сравнивать по свойствам то, что создаю я с тем, что создаётся в дизайне - расхождения типа: разное имя, разные GetNamePath и т. п. Т. е. классы получаются вроде как одинаковые.

Короче, не знаю уже что и придумать.
Ответ:
Задрался я, конечно.

Если всё создавать сначала для дочерних, а потом только для главной, то вроде пашет.
Вопрос: DBGrid скрыть отметку строки

Уважаемые специалисты, пожалуйста помогите разобраться. При переходе на страницу формируется запрос к базе, получается набор данных, который и отображается в строках DBGrid. Имеется пожелание автора интерфейсной части: при старте ни одна строка DBGrid не должна ВЫГЛЯДЕТЬ выбранной; а собственно выделение строки цветом происходило по событию DBGridCellClick. Для этого я в опциях DBGrid установил индикатор dgIndicator false; dgRowSelect false; dgAlwaysShowSelection true. Но при старте получаю следующее: индикатор DBGrid скрыт, но верхняя строка DBGrid выделяется голубым цветом (до выполнения события DBGridCellClick). Чего-то не понимаю. Пожалуйста подскажите...
Ответ: Gator,
уважаемый Gator, все, конечно же еще не просмотрел, так быстро еще не могу...
То, что посоветовал Dimitry Sib, как раз сейчас и пытаюсь разобрать... А нанимать прогр. не буду НИКОГДА. Некоторое, честно скажу, кривоватое решения я уже нашел (чтобы не тормозить весь проект). Если ввести в запрос фиктивное поле, и назначить в DBGrid.W = 1 для столбца этого то можно двигаться дальше. Повторяю, я понимаю "кривизну" этого шага и рассматриваю его как временную паузу для изучения того материала, что любезно прислали уважаемые специалисты, в том числе и Вы...Спасибо большое...
Вопрос: Импорт из Excel в DBgrid

Добрый день! Собственно сабж - надо сделать импорт из Екселя в DBGrid, а затем залить все это в базу. Записей может быть по 15-20 тысяч. Никогда раньше с этим не работал. Пытаюсь сделать через TTable.
procedure TForm1.Button1Click(Sender: TObject);
const xlCellTypeLast=$000000B;
var Excel:Variant;
    m, n:Integer;
begin
  if  not od.Execute then Exit; //через диалог открытия файла
  Excel:=CreateoleObject('Excel.Application'); //создаем экземпляр Excel
  Excel.Workbooks.Open(od.FileName); //открываем книгу Excel
  m := 2; //начинаем считывать с 2й строки
  n := excel.ActiveCell.SpecialCells(xlCellTypeLast).Row;//последняя не пустая строка

  while m<>n do begin  //перебираем строки в цикле
    Table1.Close;
    Table1.TableName := od.FileName;
    Table1.Open;
    Table1.Insert; //вставляем запись
    //распределяем значения из ячеек док-та
    //по столбцам  таблицы БД
    Table1.FieldByName('DBF_ROW_NUM').Value :=Excel.Cells[m, 1].value;
    Table1.FieldByName('ab').Value :=Excel.Cells[m, 2].value;
    Table1.FieldByName('cd').Value :=Excel.Cells[m, 3].value;
    Table1.FieldByName('ef').Value :=Excel.Cells[m, 4].value;
    Table1.FieldByName('hij').Value :=Excel.Cells[m, 5].value;
    Table1.FieldByName('k').Value :=Excel.Cells[m, 6].value;
    Table1.FieldByName('kaz_name').Value :=Excel.Cells[m, 7].value;
    Table1.FieldByName('rus_name').Value :=Excel.Cells[m, 8].value;
    Table1.FieldByName('nm').Value :=Excel.Cells[m, 9].value;
    Table1.FieldByName('CODE').Value :=Excel.Cells[m, 10].value;
    Table1.FieldByName('level').Value :=Excel.Cells[m, 11].value;
    Table1.FieldByName('custom').Value :=Excel.Cells[m, 12].value;
    inc(m); //переходим на следующую строку док-та
  end;

  Table1.First; //по завершению загрузки переходим на 1-ю запись таблицы

  //завершаем работу с экземпляром Excel
  Excel.Workbooks.Close;
  Excel.Quit;
  Excel :=Unassigned;
end;


Но на строке Table1.Open - ошибка "Share Violation. File такой-то. Process stoped"
И дальше ни в какую. Может в свойство Table1.TableName надо что-то другое записывать? Либо датасет другой юзать
Ответ: Дабы не плодить темы задам вопрос здесь.
"Импортирую" данные из Excel в DBGrid
//&#206;&#242;&#234;&#240;&#251;&#242;&#252; &#241;&#238;&#229;&#228;&#232;&#237;&#229;&#237;&#232;&#229; &#241; &#225;&#224;&#231;&#238;&#233; &#228;&#224;&#237;&#237;&#251;&#245;.
procedure TForm1.Button1Click(Sender: TObject);
var
  i : Integer;
  Sl : TStringList;
  Od : TOpenDialog;
begin
  ADOConnection1.Close;
  KillTask('excel.exe');
  ListBox1.Clear;
  Od := OpenDialog1; //OpenDialog1
  if Od.InitialDir = '' then
    Od.InitialDir := ExtractFilePath( ParamStr(0) );
  if not Od.Execute then Exit;
  if not FileExists(Od.FileName) then begin
    MessageBox(0, '&#212;&#224;&#233;&#235; &#241; &#231;&#224;&#228;&#224;&#237;&#237;&#251;&#236; &#232;&#236;&#229;&#237;&#229;&#236; &#237;&#229; &#237;&#224;&#233;&#228;&#229;&#237;. &#196;&#229;&#233;&#241;&#242;&#226;&#232;&#229; &#238;&#242;&#236;&#229;&#237;&#229;&#237;&#238;.'
      ,'&#212;&#224;&#233;&#235; &#237;&#229; &#237;&#224;&#233;&#228;&#229;&#237;', MB_OK + MB_ICONEXCLAMATION + MB_APPLMODAL);
    Exit;
  end;

  ADOConnection1.Close;

  //&#205;&#224;&#241;&#242;&#240;&#238;&#233;&#234;&#224; &#239;&#243;&#242;&#232; &#234; &#244;&#224;&#233;&#235;&#243; &#225;&#224;&#231;&#251; &#228;&#224;&#237;&#237;&#251;&#245;.

  //&#207;&#238;&#235;&#243;&#247;&#224;&#229;&#236; &#239;&#224;&#240;&#224;&#236;&#229;&#242;&#240;&#251; &#239;&#238;&#228;&#234;&#235;&#254;&#247;&#229;&#237;&#232;&#255; &#232;&#231; ADOConnection1.ConnectionString &#226; &#226;&#232;&#228;&#229; &#241;&#239;&#232;&#241;&#234;&#224;.
  Sl := TStringList.Create;
  //&#207;&#229;&#240;&#229;&#228; &#239;&#240;&#232;&#241;&#226;&#238;&#229;&#237;&#232;&#229;&#236; &#231;&#237;&#224;&#247;&#229;&#237;&#232;&#255; &#241;&#226;&#238;&#233;&#241;&#242;&#226;&#243; Text, &#231;&#224;&#236;&#229;&#237;&#255;&#229;&#236; &#231;&#237;&#224;&#234;&#232; ';' &#237;&#224; &#239;&#224;&#240;&#251; &#231;&#237;&#224;&#234;&#238;&#226; #13#10.
  Sl.Text := StringReplace(ADOConnection1.ConnectionString, ';', #13#10, [rfReplaceAll]);
  //&#207;&#240;&#238;&#226;&#229;&#240;&#255;&#229;&#236;, &#239;&#240;&#232;&#241;&#243;&#242;&#241;&#242;&#226;&#243;&#229;&#242; &#235;&#232; &#239;&#224;&#240;&#224;&#236;&#229;&#242;&#240; "Data Source".
  i := Sl.IndexOfName('Data Source');
  {&#207;&#224;&#240;&#224;&#236;&#229;&#242;&#240; "Data Source" &#228;&#238;&#235;&#230;&#229;&#237; &#232;&#236;&#229;&#242;&#252; &#231;&#237;&#224;&#247;&#229;&#237;&#232;&#229;, &#240;&#224;&#226;&#237;&#238;&#229; &#239;&#238;&#235;&#237;&#238;&#236;&#243; &#239;&#243;&#242;&#232; &#234; &#244;&#224;&#233;&#235;&#243;
  &#225;&#224;&#231;&#251; &#228;&#224;&#237;&#237;&#251;&#245;. &#197;&#241;&#235;&#232; &#239;&#224;&#240;&#224;&#236;&#229;&#242;&#240; "Data Source" &#243;&#230;&#229; &#239;&#240;&#232;&#241;&#243;&#242;&#241;&#242;&#226;&#243;&#229;&#242;, &#242;&#238; &#243;&#241;&#242;&#224;&#237;&#224;&#226;&#235;&#232;&#226;&#224;&#229;&#236;
  &#229;&#227;&#238; &#231;&#237;&#224;&#247;&#229;&#237;&#232;&#229;. &#197;&#241;&#235;&#232; &#242;&#224;&#234;&#238;&#227;&#238; &#239;&#224;&#240;&#224;&#236;&#229;&#242;&#240;&#224; &#237;&#229;&#242;, &#242;&#238; &#228;&#238;&#225;&#224;&#226;&#235;&#255;&#229;&#236; &#253;&#242;&#238;&#242; &#239;&#224;&#240;&#224;&#236;&#229;&#242;&#240; &#226;&#236;&#229;&#241;&#242;&#229;
  &#241;&#238; &#231;&#237;&#224;&#247;&#229;&#237;&#232;&#229;&#236;.}
  if i > -1 then
    Sl.Values['Data Source'] := '"' + Od.FileName + '"'
  else
    Sl.Add('Data Source="' + Od.FileName + '"');
  //&#207;&#229;&#240;&#229;&#228; &#239;&#240;&#232;&#241;&#226;&#238;&#229;&#237;&#232;&#229;&#236; &#231;&#237;&#224;&#247;&#229;&#237;&#232;&#255; &#241;&#226;&#238;&#233;&#241;&#242;&#226;&#243; ConnectionString, &#231;&#224;&#236;&#229;&#237;&#255;&#229;&#236; &#239;&#224;&#240;&#251; &#231;&#237;&#224;&#234;&#238;&#226; #13#10
  //&#237;&#224; &#231;&#237;&#224;&#234; ';'.
  ADOConnection1.ConnectionString := '';
  ADOConnection1.ConnectionString := StringReplace(Trim(Sl.Text), #13#10, ';', [rfReplaceAll]);
  FreeAndNil(Sl);

  gFileName := Od.FileName;
  //&#206;&#242;&#234;&#240;&#251;&#226;&#224;&#229;&#236; &#225;&#224;&#231;&#243; &#228;&#224;&#237;&#237;&#251;&#245;.
  ADOConnection1.Open; //Здесь возникает ошибка при попытке открыть следующий файл Excel
  //&#207;&#238;&#235;&#243;&#247;&#224;&#229;&#236; &#241;&#239;&#232;&#241;&#238;&#234; &#242;&#224;&#225;&#235;&#232;&#246; &#225;&#224;&#231;&#251; &#232; &#231;&#224;&#239;&#232;&#241;&#251;&#226;&#224;&#229;&#236; &#253;&#242;&#238;&#242; &#241;&#239;&#232;&#241;&#238;&#234; &#226; ListBox1.
  ADOConnection1.GetTableNames(ListBox1.Items);
  ListBox1.ItemIndex := 0;
  Button3.Click;
end;

При первом открытии файла все ровно открывается. При попытке открытия нового файла, получаю ошибку в строке ADOConnection1.Open; при этом если поменять местами открытие файлов, то ошибка возникнет при открытии последнего, так что файлы Excel не битые.
Прошу помощи в борьбе с ошибкой "...raised exception class EOleException with messages 'Нераспознаный формат базы данных:' путь до файла. ..."
Вопрос: Редактирование данных в DBGrid

Всем здравствуйте!

У меня есть DBGrid, в который выводятся данные из базы MSAccess через ADOQuery.
Запрос сложный, присутствуют данные из нескольких таблиц.

Возможно ли в этом случае редактировать данные прямо в таблице? (пожелание пользователей)

С уважением, Екатерина.
Ответ:
Всем здравствуйте!

У меня есть DBGrid, в который выводятся данные из базы MSAccess через ADOQuery.
Запрос сложный, присутствуют данные из нескольких таблиц.

Возможно ли в этом случае редактировать данные прямо в таблице? (пожелание пользователей)

С уважением, Екатерина.