13-04-2008, 02:12 AM
و فيك بركة
أولا أحب أن أوضح أن الشرح السابق ليس متكاملا و إنما هو إجابة حسب السؤال.
بكل بساطة لا نستدعي ExcelApplication1.Disconnect إلا عندما نريد (مثلا نضعها في OnClose للفورم أو لجدول قاعدة البيانات حسب المبرمج)
(في رأيي) من الأحسن أن لا نصدر البيانات إلا بعد الإنتهاء. لأنه قد يربك المستعمل.
بالنسبة للتحديث لم أفهم ، هل فقط الشكل أم المحتوى ؟؟
الشكل لا يحتاج إلى شرح مثل مل ذكر شابقا
أما المحتوى:
علمنا من الشرح أنه
هذا إذا علمنا أي الخانات في قاعدة البيانات غيرنا
أو يمكن إعادة العملية من جديد، و التعديل هو لا نتصل ببرنامج Excel بعد الضغط على زر Export وإنما نجعله - مثلا - بعد فتح قاعدة البيانات
هكذا نحتفظ باتصال واحد حتى نهاية التطبيق.
كما قلت أولا : من الأحسن أن لا نصدر إلا البيانات الجاهزة للتصدير.
لكن إذا صادفنا مثل هذا المشكل (مثل تطبيق لتحرير جداول في الوقت الحقيقي - أي المستعمل يرى النتيجة آنيا) يمكن استعمال Try ..Exception في طرفي أي عملية مباشرة الاتصال.
في المثال:
عند التصدير (من DBGrid)
آمل أنني أجبت ، وإذا أي استفتارات أخرى فمرحبا اجيب انا أو غيري لا فرق
كما أن هذه الحلول لا تصلح لنقلها مباشرة للبرنامج. وإنما توضح الوسيلة فقط.، ربما في المستقبل سيكون لنا لقاء ببرنامج من هذه النوعية.
في الأخير ليس إلا حل أراه ، وكل من لديه حل أحسن فليقدمه وسـأكون من الشاكرين
ما الفائدة إذا لم نتبادل الخبرات
تحياتي
أولا أحب أن أوضح أن الشرح السابق ليس متكاملا و إنما هو إجابة حسب السؤال.
إقتباس :لدي استفسار بارك الله فيك .. لو اردت مثلا أن يتم التحديث على نفس النموذج sheet على الاكسل بدون أن يقوم البرنامج بفتح نموذج جديد في كل مرة ، ماهو الجزء الذي اقوم بتعديله في الكود ؟
بكل بساطة لا نستدعي ExcelApplication1.Disconnect إلا عندما نريد (مثلا نضعها في OnClose للفورم أو لجدول قاعدة البيانات حسب المبرمج)
(في رأيي) من الأحسن أن لا نصدر البيانات إلا بعد الإنتهاء. لأنه قد يربك المستعمل.
بالنسبة للتحديث لم أفهم ، هل فقط الشكل أم المحتوى ؟؟
الشكل لا يحتاج إلى شرح مثل مل ذكر شابقا
كود :
[COLOR=Black]//في مايلي عبارة عن تلوين الخانات وتغيير الخط ...
Font.Name:='times new roman';
Font.Size:=10;
Font.Bold:=True;
With Interior do begin
ColorIndex := 15;
Pattern := xlSolid;
PatternColorIndex := xlAutomatic;
End;
With Borders do begin
LineStyle := xlContinuous;
Weight := xlThin;
ColorIndex := xlAutomatic;
End;
end;[/COLOR]أما المحتوى:
علمنا من الشرح أنه
Feuil.Range[ 'A'i , 'A'i ].Value[xlRangeValueDefault] = Table1.Fields.Fields[ i+1 ].AsString
هذا إذا علمنا أي الخانات في قاعدة البيانات غيرنا
أو يمكن إعادة العملية من جديد، و التعديل هو لا نتصل ببرنامج Excel بعد الضغط على زر Export وإنما نجعله - مثلا - بعد فتح قاعدة البيانات
كود :
[COLOR=Black]procedure TForm1.Table1AfterOpen(DataSet: TDataSet);
begin
ExcelApplication1.Connect;
ExcelApplication1.Visible[0]:=False;
Tab:=ExcelApplication1.Workbooks.Add(xlWBATWorksheet,0);
feuil:=Tab.Worksheets[1] as _worksheet;
end;[/COLOR]هكذا نحتفظ باتصال واحد حتى نهاية التطبيق.
إقتباس :وكذلك مثلا لو تم اغلاق الاكسل اثناء عملية التحديث أين يكون الكود الخاص exception في دلفي ؟
كما قلت أولا : من الأحسن أن لا نصدر إلا البيانات الجاهزة للتصدير.
لكن إذا صادفنا مثل هذا المشكل (مثل تطبيق لتحرير جداول في الوقت الحقيقي - أي المستعمل يرى النتيجة آنيا) يمكن استعمال Try ..Exception في طرفي أي عملية مباشرة الاتصال.
في المثال:
كود :
[COLOR=Black]procedure TForm1.Table1AfterOpen(DataSet: TDataSet);
begin
[color=Blue]Try[/color]
ExcelApplication1.Connect;
ExcelApplication1.Visible[0]:=False;
Tab:=ExcelApplication1.Workbooks.Add(xlWBATWorksheet,0);
feuil:=Tab.Worksheets[1] as _worksheet;
[color=Blue]except[/color]
on E: Exception do MessageDlg(E.Message,mtError,[mbOK], E.HelpContext);
[color=Blue] end;[/color]
end;[/COLOR]عند التصدير (من DBGrid)
كود :
[color=Blue]Try[/color]
[COLOR=Black] Try
ExcelApplication1.Visible[0]:=true;
For i:=0 to DBGrid1.Columns.Count-1 do
begin
with Feuil.Range[A[i+1]+'1',A[i+1]+'1'] do
begin
Value[xlRangeValueDefault]:= DBGrid1.Columns.Items[i].Title.Caption;
Font.Name:='times new roman';
Font.Size:=10;
Font.Bold:=True;
With Interior do
begin
ColorIndex := 15;
Pattern := xlSolid;
PatternColorIndex := xlAutomatic;
End;
With Borders do
begin
LineStyle := xlContinuous;
Weight := xlThin;
ColorIndex := xlAutomatic;
End;
End;
End;
j:=2;
Table1.DisableControls;
Table1.First;
While not Table1.Eof do
begin
For i:= 1 To DBGrid1.Columns.Count Do
begin
s:=A[i]+inttostr(j);
Feuil.Range[s,s].Value[xlRangeValueDefault] :=DBGrid1.Fields[i-1].AsString;
end;
Table1.Next;
j:=j+1;
end;
Finally
ExcelApplication1.Cells.Select;
ExcelApplication1.Columns.AutoFit;
ExcelApplication1.Range['A1','A1'].Select;
End;
[color=Blue]Except[/color]
on E: Exception do MessageDlg(E.Message,mtError,[mbOK], E.HelpContext);[/COLOR]
[color=Blue]End;[/color]آمل أنني أجبت ، وإذا أي استفتارات أخرى فمرحبا اجيب انا أو غيري لا فرق
كما أن هذه الحلول لا تصلح لنقلها مباشرة للبرنامج. وإنما توضح الوسيلة فقط.، ربما في المستقبل سيكون لنا لقاء ببرنامج من هذه النوعية.
في الأخير ليس إلا حل أراه ، وكل من لديه حل أحسن فليقدمه وسـأكون من الشاكرين
ما الفائدة إذا لم نتبادل الخبرات
تحياتي

