Laden...
Avatar #avatar-2643.jpg
wakestar myCSharp.de - Member
Software-Entwickler Luzern Dabei seit 15.11.2006 383 Beiträge
Benutzerbeschreibung

Forenbeiträge von wakestar Ingesamt 383 Beiträge

17.01.2007 - 17:56 Uhr

Original von christophd
Navision 3.70

keine weiteren tools die kommunizieren

im spy++ hat navision mein fenster nirgends im tree von navision. mein form ist als eigenes Programm unter dem Desktop.

Habe versucht von einer codeunit aus zu starten und einem form, macht aber keinen unterschied.

Hat mit der Version 3.7 zu tun!

Hab's kurz getestet:

  • Eingebettetes .NET-Form ruft neues .NET-Form ausserhalb von Navision auf.
    Ergebnis:

4er Client: 👍
3.7er Client: 🙄 ---> passiert genau das was Du beschrieben hast

Lösung: Noch keine 🙂

17.01.2007 - 17:17 Uhr
  • Navision-Version?
  • Sonstige Tools / Prozesse welche mit Navision kommunizieren?

ich würde mal mit spy++ oder ähnlichem schauen, was da so abläuft mit den Window-Messages

17.01.2007 - 17:07 Uhr

Original von christophd
Ich will aber das Form unabhängig von Navision machen. Es sollte eigentlich kein Parent haben, sondern ein Freies Form wie eine andere Applikation. Wenn ich es aber normal aufmache ist es immer hinter dem Navision.
Vielen Dank.

hmm.. komisch, diesen Effekt hatte ich nie, wenn ich einfach nur das Form gestartet habe ohne SetParent.
Ich nehme an du öffnest dein Form von Navision aus oder?


if ISCLEAR(form) then
  CREATE(form);

und dann


SetForegroundWindow(this.Handle)

?

EDIT: spellcheck

16.01.2007 - 12:42 Uhr

Hallo christophd

ich hab's wie folgt gelöst:

  • Rahmenloses .net - Form erstellt
  • Leeres Navision - Form erstellt (zBsp. DiagrammContainer)
  • DiagrammContainer auf einem Navision-Form als Navision-Subform eingefügt
  • WinApi - Funktionen verwenden um Handle des DiagrammContainers zu finden und das .NET - Form im DiagrammContainer einzubetten
  • Focus an Navision zurückgeben
  • Kommunikation zwischen Navision und dem .NET-Form findet via COM-Automation statt (Methoden und Events)

WinApi-Funktionen:
FindWindow, FindWindowEx, SetParent., SetForegroundWindow

gruss
wakestar

11.01.2007 - 23:58 Uhr

hm, bisher nicht erwähnt...

Winspector (Windows Message Spy)

11.01.2007 - 09:23 Uhr

Hallo Leute,

villeicht kann mir jemand sagen was ich hier falsch mache...

Ich möchte Outlook-E-Mails, welche sich im Clipboard befinden, auf die Disk speichern.

 IDataObject iData = Clipboard.GetDataObject();
                String[] allFormats = iData.GetFormats();

                foreach (string format in allFormats)
                {
                    if (iData.GetDataPresent(format))
                    {
                        Clipboard.GetDataObject().GetData(format);
                    }
                }
                // falls Outlook-E-Mail
                if (iData.GetDataPresent("FileGroupDescriptorW"))
                {
                    ClipboardMemoryStream = (MemoryStream)Clipboard.GetDataObject().GetData("FileGroupDescriptorW",true);
                    byte[] byteArray = ClipboardMemoryStream.ToArray();
                    FileStream MyFileStream = new FileStream(@"C:\test.msg", FileMode.Create);

                    for (int i = 0; i < byteArray.Length; i++)
                    {
                        MyFileStream.WriteByte(byteArray[i]);
                    }
                    MyFileStream.Close();

                }

Mein Problem ist nun, dass das 'byteArray' immer eine Länge von 1188 hat, egal wie gross das Mail effektiv ist. Beim schreiben werden eben diese 1188 bytes geschrieben und fertig.... X(

Wenn ich aber ein Attachment, welches sich im Outlook - E-Mail befindet, in die Zwischenablage kopiere, (anstatt 'FileGroupDescriptorW' verwendet man nun 'FileContents') dann stimmt das 'byteArray' und ich kann das Attachment komplett auf die Disk speichern.

🤔 🤔 🤔

[EDIT] spellcheck

09.01.2007 - 23:09 Uhr

Hallo herbivore!

Daran hatte ich auch gedacht, war aber nicht so davon überzeugt, da der StackTrace etwas unstrukturiert ausgegeben wird:
" bei Outlook._MailItem.SaveAs(String Path, Object Type)\r\n ..."

eigentlich wollte ich es etwas schöner lösen als...

if (ex.StackTrace.Contains("Outlook"))

...aber einfach ist es zugegeben!

09.01.2007 - 16:54 Uhr

Hallo Leute

Ich würde gerne zur Laufzeit herausfinden, welche DLL die COMException auslöst und je nachdem darauf reagieren.

Wenn ich im VS einen Breakpoint setze, klicke ich mich im "Locals"-Fenster durch die Variable "ex" (COMException) wie folgt in die Tiefe:

ex
-base
--base
---base
----TargetSite // Typ: System.Reflection.MethodBase
-----base // Typ: System.Reflection.MemberInfo
------Module // Typ: System.Reflection.Module
-------Name = "Interop.Outlook.dll"
-------ScopeName = "Outlook.dll"

Grundsätzliche (noob-) Frage: Muss ich das über Reflections lösen oder geht das irgendwie einfacher?

05.01.2007 - 08:48 Uhr

Hallo Leute

Ich hab' mich mal etwas ins Kapitel "Tracing and Instrumenting Applications" eingelesen und da wird gezeigt, wie man in der .config - Datei einer Win- oder Webform - Anwendung Trace Switches konfiguriert.

In meinem Fall hab' ich eine COM-Server-Assembly erstellt, welches von div. Applikationen aufgerufen werden kann. Mein COM-Server ist im GAC installiert.

Meine Frage: Gibt es eine einfache Lösung, um für meinen COM-Server einen Trace Switch zu aktivieren?
Beispielsweise wird mein Assembly auf einer Terminal-Server-Umgebung von div. Applikationen aufgerufen und bei Bedarf möchte ich für einen bestimmen (COM-)Client den Trace verfolgen können.

ps. arbeite mit .Net 2.0 / VS2005 / COM-Clients: Navision 2.x - 4.x

Gruss
wakestar

04.01.2007 - 15:34 Uhr

auch Brötchenfraktion.

Als Schüler mit QBasic (QuickBASIC) angefangen.
Damals auf 286er "Maschine" 🙂
Irgendwann dann Kaufmännsiche Lehre gemacht und dabei in die Firmeninterne Informatik-Abteilung gewechselt. Mit VB, Borland Delphi und SQL erstmals beruflich programmiert. Nach der Lehre die Wirtschaftsinformatiker-Ausbildung absolviert.
Heute ERP-Entwickler (MS Navision), was ich nun seit 5 Jahren mache und 90% aller Brötchen belegt. Der Rest ist C#, VB und SQL.

Zurzeit mach ich nebenbei den MCTS-Lehrgang für Windows- und Webapplikationen auf .NET 2.0

19.12.2006 - 13:17 Uhr

Hallo MacGyverX

Ich verstehe deine Anforderung nicht 100% da Du einmal von "Spalte zur Bearbeitung freigeben" und einmal von einer CheckBox sprichst.

Ich kann Dir aber sagen, wie ich es gelöst habe, wenn ich auf einem Excel-Worksheet gewisse Zellen sperren und andere Zellen für die Eingabe freigeben musste:

1.) Definieren, welche Zellen gesperrt sind: Zu finden unter "Zellen Formatieren, Tab "Schutz", Gesperrt ja / nein

2.) VB-Code:
ActiveSheet.Unprotect
*Vearbeitungen*
ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True

gruss
wakestar

15.12.2006 - 13:34 Uhr

Hallo Leute

Ich möchte zwischen einer COM-Anwedung und .NET Streams hin- und herschieben.
Mit dem folgenden Konstrukt wird ein InStream - Objekt von der COM-Anwendung im .NET emfangen und funktioniert soweit:


[Guid("9BEBC5EF-CB79-45d2-9C68-84F2B9A990C8")]
[InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIDispatch)]
public interface INaviStreamObject
    {               
        [DispIdAttribute(1)]
        bool LoadFromNavision([In, MarshalAs(UnmanagedType.AsAny)] object COMStream);
     }

    [ComSourceInterfaces(typeof(INaviStreamEvent))]
    public class NaviStreamObject: INaviStreamObject
{
  public bool LoadFromNavision([In, MarshalAs(UnmanagedType.AsAny)] object COMStream)
        {
           IStream COMStream1 = COMStream as IStream;
          //  InStream verarbeiten....
        }
}

Kann mir jemand sagen wie man es RICHTIG definiert damit das Ganze auch in die andere Richtung funktioniert? Von mir aus kann der Stream ein Rückgabewert einer neuen Methode oder mit einem Event mitgegeben werden.

Ich hab' schon sehr viele Stunden verbraten mit suchen,lesen,ausprobieren und bin einfach nur gescheitert: "The stream is either out of scope or has not been initialized...." 🙁

gruss
wakestar

13.12.2006 - 21:08 Uhr

hallo Mora

C/Odbc hab' ich selber noch nie verwendet und kann dir deshalb auch nicht weiterhelfen.

Wenn Du aber die Möglichkeit hast, dann schau dir mal den NAS (Navision Application Server) an. - Ist eigentlich nichts anderes als ein Navision-Client ohne GUI. Dieser muss spez. lizenziert werden. Webservices welche auf die Navision Daten und Logik zugreifen lassen sich so realisieren. - Das ist m.E. zurzeit die beste Lösung.
Ob Du dann von c#, excel oder übers web aufs Navision zugreiffst ist nur noch Geschmackssache.

gruss
wakestar

13.12.2006 - 20:21 Uhr

Danke für die Ergänzung!

Ich bin' auf die Generics gestossen da ich kürzlich für sämtliche Outlook-Items (MailItem, AppointmentItem,MeetingItem,etc.) die "Drag&Drop to WinForm" - Funktionalität einbauen musste. Da sind es halt Com - Inerfaces und man muss eben casten.

13.12.2006 - 20:01 Uhr

Danke! Jetzt hab' ichs auch verstanden! 😁

13.12.2006 - 19:43 Uhr

Hallo Peter

Soll also heissen, dass die Generics nicht immer anwendbar sind mit dem c# 2.0?

Aus dem Buch: "visual c# 2005, step by step", s. 295:

"Generics was added to c# 2.0 to remove the need for casting, improve type safety, reduce the amount of boxing required, "... usw.

🤔

gruss
wakestar

13.12.2006 - 19:04 Uhr

Achso! 😁

Danke für den Tip! Das hab' ich gecheckt.

Wie man aber das Casten in diesem Fall durch Generics ersetzen könnte ist mir nicht klar. Kannst Du mir da auf die Sprünge helfen? Es geht mir wirklich nur ums Verständnis. Die Beispiele im Buch sind zwar verständlich aber in diesem Fall hab' ich keinen Plan wie ich das implementieren soll.

13.12.2006 - 18:48 Uhr

Sorry Leute

...aber ich muss euch mit einer allg. Anfänger-Frage belästigen...

Ausgangslage:


private Bitmap ClipboardBitmap;
private string[] ClipboardFiles;

IDataObject iData = Clipboard.GetDataObject();
if (iData.GetDataPresent(DataFormats.Bitmap))
                {
                    ClipboardBitmap = (Bitmap)Clipboard.GetDataObject().GetData(DataFormats.Bitmap);
                  // Do something.....

                }
else if (iData.GetDataPresent(DataFormats.FileDrop))
                {
                    ClipboardFiles = (string[])Clipboard.GetDataObject().GetData(DataFormats.FileDrop);
                  // Do something....
                }

So, in diesem Code wird je nachdem was in der Zwischenablage ist (Bitmap oder String[]) etwas ausgeführt... (do somehting...).

Ich (.net noob) würde jetzt hingehen und für jedes weitere Bildformat (Gif, JPeg..was weiss ich..) einen weiteren "else if" Block schreiben.

Kann man das besser lösen mit Colllections.Generics? Wie würde der Code aussehen?

Ziel ist es, dass am Schluss sämtliche Bildformate in einer Funktion verabeitet werden.

danke
wakestar

12.12.2006 - 09:10 Uhr

Original von herbivore
...

  1. Man kennt sich mit OOP nicht aus. Dann kann man große bis größte Schwierigkeiten haben. Das liegt dann aber weder an C# noch .NET.
    ...
    herbivore

Das trifft defintiv auf mich zu. Ich bin seit Jahren Navision-Entwickler und da ist gar nix .Net(t) bzw. OOP.
Zudem kommt noch dazu dass ich nun Navision mit dem .NET via COM verbinde, was definitiv nicht zum Anfängerstoff gehört.

gruss
wakestar

11.12.2006 - 23:43 Uhr

Hallo zusammen

Auch ich bin Neuling in .NET und kann dodo502b sehr gut verstehen. Was das Bücher-Thema angeht stimme ich ihm voll zu.

In der Zwischenzeit hab ich 6 Bücher bei mir herumliegen... aber es reicht trotzdem nicht, um produktiv/effizient arbeiten zu können. - Ohne das Internet wäre es für mich der absolute Horror, etwas auf .NET zu entwickeln.
Ich denke das hat auch mit dem (rasant wachsenden) Umfang des .NET - Frameworks zu tun. - Bis man da den Überblick hat dauerts eine Weile.

cheers
wakestar

09.12.2006 - 01:30 Uhr

Hallo Leute

Ich denke ich hab' das Problem gefunden, da ich das "Fehlverhalten" reproduzieren kann.

Vorerst:
Mein dragdrop.dll ist nur für eine Applikation gedacht und deshalb habe ich mich entschieden,** ohne den GAC **zu arbeiten und beim Deployment das DLL jeweils ins Applikations-Verzeichnis des COM-Clients zu kopieren und zu registrieren.
Die DLL selber verwendet wiederum die Microsoft Outlook 11 Object Library damit auch Outlook - E-Mails "gedroppt" werden können. Visual Studio kopiert beim Build - Vorgang folgende Dateien ins bin\Release Verzeichnis:
Interop.Microsoft.Office.Core.dll
Interop.Outlook.dll

Ich bin fälschlicherweise davon ausgegangen, dass ich diese beiden Dateien **nicht **ins Applikations-Verzeichnis kopieren muss, da diese ja sowieso immer im System verfügbar und korrekt registriert sind, sobald Office inkl. Outlook installiert ist. - Leider nein. Wenn ich die beiden DLLs ins Applikations-Verzeichnis kopiere, funktioniert der DragDrop-Event wie gewünscht und die Welt ist wieder in Ordnung 🙂

Was mich an der ganzen Sache stört ist die Tatsache, dass nirgends ein Fehler gemeldet bzw. ausgelöst wird. - Weder beim Registrieren mit regasm, noch zur Laufzeit.

Gibt es irgendwelche Optionen welche man im Visual Studio aktivieren muss?

Oder gibt es sonstige Tools, um sowas zu verhindern?

07.12.2006 - 18:42 Uhr

Hallo Lexodus

Danke für deine Antwort.

Ich hab' schon Nächte verbracht mit sammeln und testen von Informationen betr. Verschmelzung von COM & .NET und hab' festgestellt dass es gegensätzliche Auffassungen gibt, wie man COM & .NET richtig verbindet.
Betr. den 20 sek: Der CodeProject - Artikel ist mir nicht unbekannt 🙂

Anyway: Ich hab' den ganzen STA-Müll aus dem Code rausgenommen und ein paar Tests gemacht:
Meine DLL hat den Registry-Eintrag "ThreadingModel"="Both" und somit wird autom. mit dem vom (COM-) Client aufrufenden Apartment Model weitergearbeitet. In meinem Fall ist das STA, was auch zwingend ist für die DragDrop - Funktionalität!

  • Somit kann das nicht das Problem sein.

Das mit dem Delegate schau ich nochmals an, villeicht hast Du recht.

gruss
wakestar

05.12.2006 - 22:24 Uhr

Hallo Leute

In diesem Zusammenhang habe ich eine Frage zum "STAThread":

bisher hab ich in allen Beispielen (sei es in Büchern oder im Netz) das Statement
immer vor der Main() - Methode gesehen... beim "Einstiegspunkt" ...


[STAThread]
static void Main() {
...
}

In meinem Fall hab' ich aber eine DLL, wo es eigentlich gar keine Main-Methode gibt, sondern es existieren mehere Methoden und Events welche ich der COM-Welt zur Verfügung stelle.

Gekürzte Version meines Projekts:


using System;
using System.Runtime.InteropServices;
usw...

[assembly: ClassInterface(ClassInterfaceType.AutoDual)]
namespace DragDrop
{   
    [ComVisible(false)]
    public delegate void FileDroppedEvent(string Filename);

    [Guid("bf802ebf-ce7e-4112-b97e-ef739f603fc2")]
    [InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIDispatch)]
    public interface INavDragDrop
    {
        [DispIdAttribute(1)]
        void ShowForm();
        [DispIdAttribute(2)]
        void SetFormCaption(string FormCaption); 
        usw....
    }

    [Guid("1fbd8753-9475-471e-bd81-51a2804a1360")]
    [InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIDispatch)]   
    public interface INavDragDropEvent
    {
        [DispIdAttribute(10)]
        void FileDropped(string Filename);
    }    

    [ProgId("DragDrop")]    
    [Guid("31eecda0-849c-11db-b606-0800200c9a66")]
    [ClassInterface(ClassInterfaceType.None)]
    [ComSourceInterfaces(typeof(INavDragDropEvent))]  
    public partial class frmDragDrop : Form, INavDragDrop
    {               
        [DllImport("user32.dll")]
        public static extern int FindWindow(string strclassName, string strWindowName);       
        usw...       

        private int hwndNavision;
        usw....
                
        public frmDragDrop()
        {
            System.Threading.Thread.CurrentThread.SetApartmentState(System.Threading.ApartmentState.STA);
            InitializeComponent();
        }

        [STAThread]
        public void ShowForm()
        {
         System.Threading.Thread.CurrentThread.SetApartmentState(System.Threading.ApartmentState.STA);
            Debug.WriteLine(System.Threading.Thread.CurrentThread.ApartmentState.ToString());
            this.Show();
        ...
         .... 
        }
    usw...

Meine Fragen:

A. Muss ich nun vor jeder Methode das [STAThread] setzen? Es kann ja sein dass diesselbe Methode vom COM-Client (innerhalb der Instanz) mehrmals aufgerufen wird...

B. [edit] glöscht

04.12.2006 - 12:30 Uhr

niemand X(

Ok, ich frag mal etwas allgemeiner: Wie könnte ich der Ursache dieses Problems auf die Spur kommen?

Ich bin Neuling was .NET - Entwicklung angeht und habe d.h. noch zu wenig Erfahrung mit dem Visual Studio und dessen Tools.

[EDIT] Das hier hat auch nichts gebracht:
http://www.codeproject.com/csharp/your_drag_and_drop.asp?df=100&forumid=97942&exp=0

03.12.2006 - 20:42 Uhr

Hallo Leute

Ich hab' ein Assembly (dragdrop.dll) erstellt, welches über COM aufgerufen werden kann. Es handelt sich um ein stinknormales .NET - Form, welches Drag & Drop - Funktionalität zur Verfügung stellt. Die aufrufende COM-Applikation "sollte" jeweils den "gedroppten" Filenamen via Event erhalten.
Nun funktioniert das ganze prima auf meiner Entwickler - Maschine.
Sobald ich das Teil auf einer anderen Umgebung (Virtual PC, Laptop,etc.) installiere, klappts nicht mehr ganz:

Registrierung auf fremder Umgebung:
regasm dragdrop.dll /unregister
regasm dragdrop.dll /tlb:dragdrop.tlb
regasm dragdrop.dll /regfile:dragdrop.reg
Es werden keine Fehler gemeldet und die Registry - Einträge scheinen auch i.O zu sein.

Dann zur Laufzeit sagt mir der Debug-Monitor:
COM-Objekt laden OK
FormLoad OK
DragEnter-Event OK
DragDrop-Event NOK!!!! ---> der DragDropEvent wird einfach nicht ausfgeführt!?! X(

Code frmDragDrop_DragDrop:


private void frmDragDrop_DragDrop(object sender, DragEventArgs e)
        {
            Debug.WriteLine(DateTime.Now.ToString() + ":" + "DragDrop");
            try
            {
                string[] fileNames = null;
                if (e.Data.GetDataPresent(DataFormats.FileDrop, false) == true)
                {
                    fileNames = (string[])e.Data.GetData(DataFormats.FileDrop);
                    foreach (string fileName in fileNames)
                    {
                        FileDropped(fileName); // FileDropped : Event für COM-Client triggern
                        Debug.WriteLine(DateTime.Now.ToString() + ":" + "FileDropped:"  + fileName);
                    }
                }                
            }
            catch (System.Exception ex)
            {
                Debug.WriteLine(ex.Message);
            }
        }

ABER: Sobald ich auf dem "Fremd-System" mit dem Visual Studio einen neuen "Build" mache funktioniert das ganze anschliessend einwandfrei!!! X(

Kann mir jemand sagen was ich falsch mache???? 🤔

[EDIT] Oder: Wie finde ich heraus, was alles beim Build - Vorgang im VS 2005 passiert???

29.11.2006 - 16:32 Uhr

hab' in der Zwischenzeit diverses ausprobiert aber irgendwie scheint die Methode mit dem Timer und den 5 Sek. am "sichersten" zu sein .. ist halt unschön aber es funktioniert.

Sowas wie


while (NavHwndParent == 0)
{
   suche Handle 
}

führt zu gar nix wenn die Methode vom Navision her zu früh angekickt wird (findet nie das Navision-Form)

Und im Navision gibt es keine Möglichkeit um festzustellen, ob nun alles 100% geladen ist.... ... damnit. 😜

29.11.2006 - 10:32 Uhr

Hallo Leute

Besten Dank für die bisherigen Infos, ich habs soweit geschaft, Navision als "Container" zu verwenden. - Das ganze funktioniert im Moment aber nur, wenn ich im Navision einen Button drücke und so das .NET-Form öffne.

Jetzt möchte ich aber dass das .NET-Form autom. beim Öffnen des Navision-Forms geöffnet wird... und nun kommt das "Timing" - Problem ins Spiel:
Da Navision-Forms z.T. auch Logik (ich weiss...) oder auch zur Laufzeit berechnete Felder beinhalten, kann es manchmal ein paar Sekunden dauern, bis das Form vollständig angezeigt wird.

Mit dem folgenden Konstrukt funktionierts, wenn ich im Navision den Timer-Invtervall auf 5 sek. stelle, aber ist halt nicht gerade das Gelbe vom Ei.

Code im Navision-Form:


OnTimer()  // z.Bsp. alle 5 Sek.
IF ISCLEAR(DragDrop) THEN BEGIN   // DragDrop: Automation-Variable
  CREATE(DragDrop);  // Instanz erstellen
  DragDrop.SetFormCaption("No." + ' ' + "Sell-to Customer Name" + ' - ' +    CurrForm.CAPTION);
  // SetFormCaption wird verwendet für Window-Handle
  DragDrop.ShowForm(); 
END;


public void ShowForm()
        {
            this.Show();
        }

private void frmDragDrop_Load(object sender, EventArgs e)
       {
         // Gewünschtes Window-Handle suchen und Parent setzen
        //  wenn Handle gefunden
       }    

Eigentlich möchte ich das Ganze so lösen, dass die erzeugte DragDrop-Instanz so lange versucht das Form anzuzeigen, bis erfolgreich ein Handle gefunden und 'Parent' gesetzt wird.

Wie würdet ihr das Ganze lösen? Tips? Code?

17.11.2006 - 11:30 Uhr

Original von LastGentleman
Das andocken musst du selber realiesieren, es gibt da in den APIs eine Move Funktion mit der du dir größe Ändern kannst.

Verstehe ich richtig, dass ich mit der 'WM_MOVE' - Message die Position des Navision-Forms abfangen und mit der 'MoveWindow' Funktion das C# - Form bewegen muss?

16.11.2006 - 19:09 Uhr

Original von LastGentleman
Suche mal nach SetParent, dort wirst du einiges finden.

Vielen Dank für den Tip!
Hab's jetzt hingekriegt, dass mein C# - Form im Navision-Form erscheint.

Jetzt fehlt nicht mehr viel: es geht nur noch darum, dass es sich immer an die Grösse des Navison-Forms anpasst (andockt).. beim Öffnen sowie beim "Resizen" des Navision-Forms.
Welche Funktionen verwendet man dafür?

16.11.2006 - 16:20 Uhr

Original von LastGentleman
Hier findest du mehr


>

>

Hallo LastGentleman

Danke für den Hinweis. Ich hab's kurz durchgelesen und der interessanteste Teil ist :

Das ganze geht natürlich auch mit .NET Forms. Mit der API-Funktion SetParent kann man dem Access Anwendung sogar .NET Windows Forms als Unterformulare bzw. Controls auf einem Access Formular unterschieben. Mit ein paar Handgriffen in Visual Basic 6.0 kann man sich so ein "Kaper" Control (OCX) bauen, welches sich um die Extraktion der Window-Handles und die automatische Größenanpassung bei verändern des Rahmens kümmert. Man kann mit .NET leider keine ActiveX-Controls bauen (Windows Forms Controls sind nicht kompatiebel!), deshalb muss für so ein Kaper-Control auf das gute alte VB6 zurückgegriffen werden.

Jetzt wär noch interessant zu wissen, wie das "Kaper"-Control erstellt und mit dem c#-Form verlinkt werden kann?

16.11.2006 - 15:37 Uhr

Hallo Timo!

Hier gehts zum Download des C++ - Beispiels:

http://mibuso.com/dl.asp?FileID=548&Type=file

Zur Info: Die Datei 'F88000' ist schlussendlich das (Container-) Form - Objekt in Navision, welches über 'Automation' auf das externe Control zugreifft.

16.11.2006 - 13:55 Uhr

Niemand? 8o

Ich hab' im Netz ein C++ - Beispiel gefunden in dem Funktionen aus der ATL - Library verwendet werden.

... ich kann aber damit nichts anfangen da meine C++ - Kenntnisse gleich 'null' sind. 🙁

16.11.2006 - 10:20 Uhr

Hallo Leute

Folgendes Problem:
Ich habe ein Form mit c# und VS2005 erstellt, welches über COM-Automation aufgerufen werden kann. So weit, so gut.
Nun möchte ich aber mein Form "eingebettet" haben in einem Subform vom aufrufenden Programm (externe Applikation welche ich nicht anpassen kann, da kein Sourcecode verfügbar).

Ich bin nun soweit gekommen dass ich herausfinde, wie das Handle des Subforms lautet, in dem es eingebettet werden soll.

Ziel ist es also, dass mein Form so aussieht, als wäre es Teil der externen Applikation.

Geht das überhaupt mit C# irgendwie?

Kann mir jemand einen Tipp geben, wie ich das bewerkstelligen könnte?
Beispiel-Code wäre super!

ps. externe Applikation: MBS Navision (ERP-System).