<?xml version="1.0"?>
<configuration>
  <startup useLegacyV2RuntimeActivationPolicy="true">
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
  </startup>
</configuration>


혼합 모드 어셈블리는 런타임의 버전 'v2.0.50727'에 대해 빌드되며 추가 구성 정보 없이 '4.0' 런타임에 로드할 수 없습니다.
라는 오류가 발생할 경우
app.config 파일에 다음 설정을 입력한다.
<startup useLegacyV2RuntimeActivationPolicy="true">

참조 : http://social.technet.microsoft.com/Forums/en-US/ieitprocurrentver/thread/1342e167-8016-4a75-99bf-4d11d01d9bb1


Windows 7 64bit 환경 기준으로 레지스터리 값 수정하면 됨.

(첨부 파일은 또한 Windows 7 64bit 기준으로 작성 됨)

[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\.NETFramework]

"EnableIEHosting"=dword:00000001


EnableIEHosting_Windows7_64bit.reg.zip


오늘에서야 알았다...

Springnote가 종료 된걸...

Springnote에서 내보내기로 한 글도 제법되는데...

관련 첨부파일 및 이미지 내용은 다 날아갔다...

저번주에 최종 종료되었고, 3-4개월전부터 공지를 한거 같은데...

난 왜 오늘에서야 알게되었을까..


여기에 내보내기 안한 것도 많은데...


더불어... 첨부파일과 이미지들... 어떻게 만드냐 ^^;;


덗두리 해 봅니다.

'잡답' 카테고리의 다른 글

SyntaxHighlighter 3.0.83 설치  (0) 2012.06.14
'나갈래' 외치는 고양이  (0) 2012.04.04
맘에 드는 게시판이 없는것 같다...  (3) 2009.01.06
강좌 만들기가 너무 귀찮아  (1) 2008.09.26
우애수  (0) 2008.08.13

DevExpress.XtraGrid.Views.Grid.GridView gv = sender as DevExpress.XtraGrid.Views.Grid.GridView;
if (gv.FocusedColumn.FieldName == "DIV_EXP_NO" && gv.ActiveEditor is GridLookUpEdit)
                        {
                            GridLookUpEdit lue = gv.ActiveEditor as GridLookUpEdit;
                            DataTable dt = lue.Properties.DataSource as DataTable;
                            DataView dv = new DataView(dt);
                            string strItem = gv.GetRowCellValue(gv.FocusedRowHandle, gv.Columns["ITEM_NAME"]).ToString();
                            dv.RowFilter = string.Format("ITEM_NAME='{0}'", strItem);
                            lue.Properties.DataSource = dv;
                        }

출처 : http://blog.happydong.kr/189

 

C#으로 개발을 하다보면 다양한 상황에서 디버깅을해서 처리 값을 확인해야 하는 일이 생긴다. Output Value를 확인하다든지... 정확한 값이 세팅되었다 든지..., 더미값(쓰레기값)을 세팅해서 프로그램을 테스트 한다던지... 등등의 여러가지 상황에서 디버깅 값을 확인해야 할 일들이 빈번하게 있기 마련이다. 그리고 이렇게 디버깅한 내용은 릴리즈 할때는 적용이 안되어야 하는 것이 맞다. 그래서 디버깅 코드를 짤때에는 디버그모드일때와 릴리지모드일때 실행되야할 코드를 적절히 나눠서 짜야한다. 이렇게 구분하기 위해서는  #if #endifConditional Attribute를 적절하게 사용하는 것이 좋다. 
처음 개발을 시작했을 때는 생각해보자!! 예전 같았으면 프로그램 소스를 짜면서 디버깅소스를 코드로 같이 짜고 디버그 모드(Debug Mode)에서 확인하고 필요없을때(릴리즈때)는 주석처리하면서 했을 것이다. 물론, 머리가 좋은 사람들은 이런식으로 처리안 했을 것이다. 그러나 프로그램을 처음 접하면서 배우는 것이 디버깅하는 방법보다, 주석을 먼저 배우기때문에 이런 불편한 방법을 사용하는 초보 개발자들이 몇몇 있을 것이다. 물론, 나도 처음 배울때 이랬다.

주석으로 처리하는 잘못된 예

/*  릴리즈때는 사용하지 않음.
            MessageBox.Show("Test");
  */

위 코드의 내용 처럼 릴리즈 모드(Release Mode)일때와 디버그 모드(Debug Mode)일때를 확인해서 처리해야하는 경우가 있다면 바보같이 주석처리해가면서 처리하지말고 #if #end와 Conditional Attribute를 이용하자!!

1. #if #endif 사용

이는 메소드 내부의 간단한 처리를 확인 할때 사용하는 것이 적절한 것 같다. 사용 방법은 아래와 같다.

private void InitializeView()
{

#if DEBUG
	// 처리된 결과의 값을 찍어 봅니다. 
	Debug.WriteLine("Value1");
	Debug.WriteLine("Value2");
#endif
}

#if #endif를 많이 사용하면 코드가 조금 지저분해 질수 있으니 적절하게 적당히 사용하는 것이 좋을 것 같다. 

 

 

2. Conditional Attribute 사용

이는 메소드 형태로 사용할수 있으면 빌드모드에 따라 해당 메소드를 호출할지 않할지를 결정할수 있다. 사용 방법은 아래와 같다.

Conditional Attribute

private void InitializeView()
{
	... 내용 생략...
	DebugMsg();
}
[Conditional("DEBUG")]
public void DebugMsg()
{
	MessageBox.Show("Conditional Test");
}

 

InitializeView메소드안에 보면 DebugMsg라는 메소드를 호출하고 있는데, 빌드모드가 디버그이면 해당 메소드를 호출할 것이고, 릴리즈일 경우 호출되지 않을 것이다. 그리고 Conditional은 다중 지정이 가능하다. 즉, [Conditional("DEBUG"), Conditional("TRACE")] 이런식으로 가능하다.

#if #endif와 Conditional Attribute를 적절히 사용하면 보다 깔끔한 코드, 디버그모드와 릴리지모드를 나눠서 코드를 정리할수 있을 것이다. 물론, #if #endif보다는 Conditional Attribute를 활용하는 쪽이 보다 깔끔한 소스를 짤수 있을 것이다. Conditional를 선언한 메소드들을 한클래스에 모아서 사용하는 것도 적절하다 볼수 있다.

참고 )
프로젝트의 프로퍼티(Properties)메뉴에 들어가, 빌드(Build) 옵션에서 해당 빌드모드의 내용을 체크할수 있다.

 

출처 : http://blog.happydong.kr/189

 

 

AutoCAD P&ID 2012와 2013에서 확인하였으나 동일한 오류를 발생함

 

동영상을 보면 쉽게 이해가 가실 겁니다. 불특정 영역에서 발생되는 문제입니다.

 

------------------------------------------------------------------

2012년 12월 14일 해결 방법 추가

 

오류나는 라인 부분의 기존 라인을 보면 좌표 Z들이 들어가 있습니다. 일반적으로 P&ID는 2D 이기 때문에 보이기에는 정상적이나 실제론 Z  좌표가 0이 되야 정상인데, 유추 해보건데 취득한 도면이 기존에 다른 기준좌표를 가지고 있는 것들을 계속해서 Insert 하여 서로 좌표가 상이 한것 같습니다. 일단 잡설은 그만하고 해결 방법입니다.

 

해당 도면을 Open 한후

  • LTSCALE 조절 (1로 설정)
  • 기존 Line의 Z관련 값 0으로 조절

---------------

Open Error Drwaing File

---------------

  and

---------------

Command: LTSCALE
Command: Enter new linetype scale factor <3.0000>: 1

---------------

  and

---------------

Error Line Geometry > [Start Z] and [End Z] : 0

Use [Properties] Dialog (Line Object Selected [Ctrl+1])

---------------

 

여기서 제일 중요한것은 Z값 설정인것 같습니다.

 

 

본 해결책을 알려 주신 투아이티씨 솔루션(http://www.cimage.co.kr)와 이하 관계자 여러분께 감사의 인사를 전합니다.

AutoCAD P&ID 작성시 어떤 이유 때문인지 정확하지 않으나…

(저희 같은 경우 AutoCAD P&ID 비정상 종료(뜅김)로 인한 오류로 판단됨)

기존에 Tag가 존재하지 않는데 아래 캡쳐 화면처럼 Dialog Message Box처럼 오류 발생시 해결 방법

 

"Another asset in the project has the same tag which has not been saved. Cannot merge with that tag. Please enter a unique tag."

 

 

일단 해당 프로젝트의 P&ID관련 Database 직접 수정

  • SQLite : ProcessPower.dcf
  • SQL Server : 지정한 Database (이건 대부분 Admin 또는 관리자(DBA)가 생성하므로 해당 업무 담당자에게 문의 / Project Propertty에서 확인 가능)

많은 테이블 중 “PnPTagRegistry”에서 해당 컬럼(필드) 중 “Tag” 에 입력할려고 하는 Tag를 찾아 해당 Record 삭제 후 저장(commit) 후 AutoCAD P&ID에서 해당 Tag입력…

 

상기 방법은 잘못된 사용으로 인한 치명적인 오류를 내포하고 있으므로 Database의 지식이 있는 분에게 요청하시는게 좋을 듯합니다.

본인은 모든 상기 방법에 따른 오류에 대한 책임이 없음을 거듭 언급 드립니다.

별출처 : MSDN(http://msdn.microsoft.com/ko-kr/library/bb397679.aspx)

 

 

<?XML:NAMESPACE PREFIX = [default] http://www.w3.org/1999/xhtml NS = "http://www.w3.org/1999/xhtml" />이러한 변환은 예를 들어 명령줄 인수에서 숫자 입력을 가져올 때 유용할 수 있습니다. 비슷한 메서드로 문자열을 float 또는 long 등의 다른 숫자 형식으로 변환할 수도 있습니다. 다음 표에서는 이러한 메서드를 보여 줍니다.

숫자 형식

방법

decimal

ToDecimal(String)

float

ToSingle(String)

double

ToDouble(String)

short

ToInt16(String)

int

ToInt32(String)

long

ToInt64(String)

ushort

ToUInt16(String)

uint

ToUInt32(String)

ulong

ToUInt64(String)

예제

 


이 예제에서는 ToInt32(String) 메서드를 호출하여 입력 stringint로 변환합니다. 프로그램이이 메서드에 의해 throw 될 수 있는 두 개의 가장 일반적인 예외를 catch 합니다. FormatExceptionOverflowException. 정수 저장소 위치를 오버플로하지 않고 숫자를 증가시킬 수 있는 경우 프로그램에서 결과에 1을 더하여 출력을 인쇄합니다.

C#

static void Main(string[] args)
{
    int numVal = -1;
    bool repeat = true;

    while (repeat == true)
    {
        Console.WriteLine("Enter a number between −2,147,483,648 and +2,147,483,647 (inclusive).");

        string input = Console.ReadLine();

        // ToInt32 can throw FormatException or OverflowException.
        try
        {
            numVal = Convert.ToInt32(input);
        }
        catch (FormatException e)
        {
            Console.WriteLine("Input string is not a sequence of digits.");
        }
        catch (OverflowException e)
        {
            Console.WriteLine("The number cannot fit in an Int32.");
        }
        finally
        {
            if (numVal < Int32.MaxValue)
            {
                Console.WriteLine("The new value is {0}", numVal + 1);
            }
            else
            {
                Console.WriteLine("numVal cannot be incremented beyond its current value");
            }
        }
        Console.WriteLine("Go again? Y/N");
        string go = Console.ReadLine();
        if (go == "Y" || go == "y")
        {
            repeat = true;
        }
        else
        {
            repeat = false;
        }
    }
    // Keep the console open in debug mode.
    Console.WriteLine("Press any key to exit.");
    Console.ReadKey();    
}
// Sample Output:
// Enter a number between -2,147,483,648 and +2,147,483,647 (inclusive).
// 473
// The new value is 474
// Go again? Y/N
// y
// Enter a number between -2,147,483,648 and +2,147,483,647 (inclusive).
// 2147483647
// numVal cannot be incremented beyond its current value
// Go again? Y/N
// Y
// Enter a number between -2,147,483,648 and +2,147,483,647 (inclusive).
// -1000
// The new value is -999
// Go again? Y/N
// n
// Press any key to exit.

string 을 int로 변환하는 또 다른 방법은 System.Int32 구조체의 Parse 또는 TryParse 메서드를 사용하는 것입니다. ToUInt32 메서드는 Parse를 내부적으로 사용합니다. 문자열이 올바른 형식이 아닌 경우 Parse는 예외를 throw하는 반면, TryParse는 예외를 throw하지 않고false를 반환합니다. 다음 예제에서는 ParseTryParse에 대한 호출이 성공하는 경우와 실패하는 경우를 모두 보여 줍니다.

C#

int numVal = Int32.Parse("-105");
Console.WriteLine(numVal);
// Output: -105

C#

// TryParse returns true if the conversion succeeded
// and stores the result in the specified variable.
int j;
bool result = Int32.TryParse("-105", out j);
if (true == result)
    Console.WriteLine(j);
else
    Console.WriteLine("String could not be parsed.");
// Output: -105

C#

try
{
    int m = Int32.Parse("abc");
}
catch (FormatException e)
{
    Console.WriteLine(e.Message);
}
// Output: Input string was not in a correct format.

C#

string inputString = "abc";
int numValue;
bool parsed = Int32.TryParse(inputString, out numValue);

if (!parsed)
    Console.WriteLine("Int32.TryParse could not parse '{0}' to an int.\n", inputString);

// Output: Int32.TryParse could not parse 'abc' to an int.

별Link : How to Integrate Excel in a Windows Form Application using the WebBrowser

 

 

Sample Image - Embedding_Excel.jpg

Introduction

With Automation, you are able to drive any Office application from your .NET application. This is really powerful. It may happen that one time, you would like to integrate such an application (Excel, for example) in your own application, and handle it like a control. A first approach has already been published on The Code Project (see the Background section in this article). The other method I will describe here uses the Microsoft WebBrowser control as a host for the document.

Background

You can study Anup Shinde's article. His method works fine. Instead of the WebBrowser control, it is based on Windows Win32 API.

If you are interested in the original publication of the WebBrowser method, you can see the Microsoft KB.

Starting from scratch

Create a new form MyForm, and add a new WebBrowser control, named webBrowser1. Add the m_ExcelFileNamefield :

Collapse | Copy Code

// Contains the path to the workbook file
private string m_ExcelFileName="test.xls"; // Replace here with an existing file

Then create a function OpenFile like this :

Collapse | Copy Code

public void OpenFile(string filename) 
{
    // Check the file exists
    if(!System.IO.File.Exists(filename)) throw new Exception();
        m_ExcelFileName=filename;
    // Load the workbook in the WebBrowser control
    this.webBrowser1.Navigate(filename,false);
}

You can try and run your application, giving the filename an existing excel file path. You'll see that it works perfectly. Really easy, don't you think?

In fact, you will quickly get into trouble if you try to run the application a second time with the same Excel file. An error message tells you that your file is already in use. This may be strange because you think that you closed your application, and you did. So where is the problem?

Let's see what happened in the background. While the WebBrowser was navigating, it opened an invisible Excel application, and loaded the workbook inside it. And when you closed your application, the WebBrowser didn't close either its Excel application or the workbook. So we must do it, and this is the most difficult part of our job.

Solving the problem step by step

Before further reading, you have to load the following Office COM library references for Office Automation :

  • Microsoft Excel 11.0 Object Library
  • Microsoft Office 11.0 Object Library

and use them in your file :

Collapse | Copy Code

using Microsoft.Office.Core;
using Microsoft.Office.Interop.Excel;

You'll need these assemblies too :

Collapse | Copy Code

using System.Runtime.InteropServices;
using System.Reflection;
using System.Runtime.InteropServices.ComTypes;

Declare these two Excel fields :

Collapse | Copy Code

// Contains a reference to the hosting application
private Microsoft.Office.Interop.Excel.Application m_XlApplication=null;
// Contains a reference to the active workbook
private Workbook m_Workbook=null;

Before trying to close the workbook, we need a handle on it. For convenience, the best moment to do this is just after the document has been loaded in the WebBrowser. So we have to generate a webBrowser1_Navigated event handler and its matching function, like this :

Collapse | Copy Code

private void webBrowser1_Navigated(object sender,WebBrowserNavigatedEventArgs e) 
{
    // Creation of the workbook object
    if((m_Workbook=RetrieveWorkbook(m_ExcelFileName))==null)return;
    // Create the Excel.Application
    m_XlApplication=(Microsoft.Office.Interop.Excel.Application)m_Workbook.Application;
}

Then we define the RetrieveWorkbook function. It is based on two imported Win32 API functions, that retrieve all the programs that are running on our computer. Our job is to search among them the one that is working with the workbook that names xlfile. The code is like this :

Collapse | Copy Code

[DllImport("ole32.dll")] static extern int GetRunningObjectTable
                (uint reserved,out IRunningObjectTable pprot);
[DllImport("ole32.dll")] static extern int CreateBindCtx(uint reserved,out IBindCtx pctx);

public Workbook RetrieveWorkbook(string xlfile) 
{
        IRunningObjectTable prot=null;
        IEnumMoniker pmonkenum=null;
        try 
        {
            IntPtr pfetched=IntPtr.Zero;
            // Query the running object table (ROT)
            if(GetRunningObjectTable(0,out prot)!=0||prot==null) return null;
            prot.EnumRunning(out pmonkenum); pmonkenum.Reset();
            IMoniker[] monikers=new IMoniker[1];
            while(pmonkenum.Next(1,monikers,pfetched)==0) 
            {
                IBindCtx pctx; string filepathname;
                CreateBindCtx(0,out pctx);
                 // Get the name of the file
                 monikers[0].GetDisplayName(pctx,null,out filepathname);
                 // Clean up
                 Marshal.ReleaseComObject(pctx);
                 // Search for the workbook
                 if(filepathname.IndexOf(xlfile)!=-1) 
                 {
                     object roval;
                     // Get a handle on the workbook
                     prot.GetObject(monikers[0],out roval);
                     return roval as Workbook;
                 }
              }
         } 
         catch 
         {
             return null;
         } 
         finally 
         {
             // Clean up
             if(prot!=null) Marshal.ReleaseComObject(prot);
             if(pmonkenum!=null) Marshal.ReleaseComObject(pmonkenum);
         }
         return null;
}

Now we can write the code involved to close the background Excel application, while overriding the OnClose() event :

Collapse | Copy Code

protected override void OnClosed(object sender, EventArgs e) 
{
    try 
    {
        // Quit Excel and clean up.
        if(m_Workbook!=null) 
        {
            m_Workbook.Close(true,Missing.Value,Missing.Value);
            System.Runtime.InteropServices.Marshal.ReleaseComObject
                                    (m_Workbook);
            m_Workbook=null;
        }
        if(m_XlApplication!=null) 
        {
            m_XlApplication.Quit();
            System.Runtime.InteropServices.Marshal.ReleaseComObject
                                (m_XlApplication);
            m_XlApplication=null;
            System.GC.Collect();
        }
    } 
    catch 
    {
        MessageBox.Show("Failed to close the application");
    }
}

Using the code

You can use the code as written upper. Otherwise, it may be interesting to embed all the stuff in a .NET control. You'll be able to manage CommandBars, Menus, etc. inside the control. You will find some code in the downloadable package section.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

Temporary Directory

string strTempPath = System.IO.Path.GetTempPath();

 

Temporary FileName

string strTempFileName = System.IO.Path.GetTempFileName();

+ Recent posts